php - 在 Laravel 项目中匹配彼此喜欢的用户时出现问题

标签 php laravel

我的 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/

相关文章:

mysql - Laravel - 如何使用查询生成器执行特定查询

laravel - 如何使用Laravel迁移从列中删除唯一约束?

php - Laravel Cookies 奇怪的行为 - 总是设置相同的值

php - 键存在于数组中时出现未定义索引错误

php - 选择哪个Websocket服务器?

php - MySql Tinytext vs Varchar vs Char

php - MySQL:使用 BETWEEN 进行多个 AND 查询?

php - 解析 ZoHo CRM API 返回的 XML

jquery - 如何让 jQuery 与 Laravel 一起工作?

php - 标记系统问题 - 重复图像