我的 Laravel 项目中有类似的功能,当前用户可以喜欢另一个用户,并且它会像这样正确地写入数据库表(likes_users)中。
id user_id liked_user_id is_mutual_like
1 1 5 0
现在我想编写一个查询或其他内容,当 id 为 5 的用户(在本例中)喜欢 id 为 1 的用户时,它会将“is_mutual_like”列更新为 1 或 true,因为它是 bool 列。我需要关于如何做到这一点的帮助。任何帮助表示赞赏。这是我的代码。
UserController.php
<?php
namespace App\Http\Controllers;
use App\City;
use App\User;
use App\LikesUser;
use App\UserProfile;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Redirect;
class UserController extends Controller
{
public function showProfile($username, Request $request)
{
$userId = Auth::user()->id;
$likedUserId = User::all()->random(1)->first()->id;
$q = LikesUser::likes($userId, $likedUserId);
return view('profile.show');
}
}
LikesUser.php
<?php
namespace App;
use Illuminate\Support\Facades\DB;
use Illuminate\Database\Eloquent\Model;
class LikesUser extends Model
{
protected $fillable = [
'user_id',
'liked_user_id',
'is_mutual_like',
];
public static function likes($userId, $likedUserId)
{
if ($userId === $likedUserId) {
return NULL;
}
$existingRequest = static::likesCheck($userId, $likedUserId);
if (!empty($existingRequest)) {
return NULL;
}
return static::newLikes($userId, $likedUserId);
}
public static function likesCheck($userId, $likedUserId)
{
return LikesUser::where('user_id', '=', $userId)->where('liked_user_id', $likedUserId)->count();
}
public static function newLikes($userId, $likedUserId)
{
return DB::table('likes_users')->insertGetId([
'user_id' => $userId,
'liked_user_id' => $likedUserId,
]);
}
}
User.php
<?php
namespace App;
use Carbon\Carbon;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable
{
use Notifiable;
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'gender_id',
'city_id',
'username',
'email',
'first_name',
'last_name',
'age',
'date_of_birth',
'premium',
'active',
'interested_in',
'job',
'mobile_number',
'mobile_verification_id',
'inform_new_message',
'inform_gift_received',
'inform_new_singles',
'inform_whatchlist',
'inform_when_liked',
'inform_when_matched',
];
protected $dates = [
'date_of_birth',
'email_verified_at',
'mobile_verified_at',
'premium_purchased_at',
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password', 'remember_token',
];
/**
* The attributes that should be cast to native types.
*
* @var array
*/
protected $casts = [
'premium' => 'boolean',
'inform_new_message',
'inform_gift_received',
'inform_new_singles',
'inform_whatchlist',
'inform_when_liked',
'inform_when_matched',
];
/**
* To get the users liked by the current user
*/
public function likedUsers()
{
return $this->belongsToMany(User::class, 'likes_users', 'user_id', 'liked_user_id');
}
/**
* To get the users who liked the current user
*/
public function usersLiked()
{
return $this->belongsToMany(User::class, 'likes_users', 'liked_user_id', 'user_id');
}
public function mutualFriends()
{
return $this->belongsToMany(User::class, 'likes_users', 'liked_user_id', 'user_id')->where('likes_users.is_mutual_like', true);
}
}
喜欢用户表
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateLikesUsersTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('likes_users', function (Blueprint $table) {
$table->bigIncrements('id');
$table->unsignedBigInteger('user_id')->nullable();
$table->unsignedBigInteger('liked_user_id')->nullable();
$table->boolean('is_mutual_like')->default(false);
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('likes_users');
}
}
最佳答案
我已经编辑了我的答案以匹配您的方法和变量
public static function newLikes($userId, $likedUserId)
{
// $userId is user1 next
// $likedUserId is user2 next
// check if the user2 already liked user1
$mutual_like = LikesUser::where('liked_user_id', $userId)->where('user_id', $likedUserId)->first();
// save user1 like
$like = new LikesUser();
$like->user_id = $userId;
$like->liked_user_id = $likedUserId;
$like->is_mutual_like = !!$mutual_like; // same as $mutual_like ? 1 : 0;
$like->save();
// also set is_mutual true for user2
if($mutual_like){
$mutual_like->is_mutual_like = 1;
$mutual_like->save();
}
return "Anything you want to return";
}
只需访问测试路由并运行其中的函数即可检查它是否有效。
// web.php
Route::get('/test', function(){
\App\LikesUser::newLikes(1,2);
\App\LikesUser::newLikes(2,1);
});
并检查您的数据库,或者只是使用测试路由
关于php - 在 Laravel 项目中匹配彼此喜欢的用户时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60395986/