Это быстрое решение. Может быть более эффективный способ сделать это sh. Предложения приветствуются.
Моя идея - установить флаг is_mutual
для лайков пользователей. Если пользователи будут любить друг друга, будет установлен флаг is_mutual
.
Давайте начнем с миграции.
Создание user_likes
таблицы.
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('user_likes', function (Blueprint $table) {
$table->bigIncrements('id');
$table->unsignedBigInteger('user_id')->comment('user who liked this');
$table->unsignedBigInteger('liked_user_id')->comment('user whom this liked');
$table->boolean('is_mutual')->default(false)->comment('is users like each other');
$table->timestamps();
$table->softDeletes();
$table->foreign('user_id')->references('id')->on('users');
$table->foreign('liked_user_id')->references('id')->on('users');
});
}
Затем, Я обновил свою модель User
, добавив следующие отношения
public function likedUsers()
{
return $this->belongsToMany('App\User', 'user_likes', 'user_id', 'liked_user_id');
}
public function mutualFriends()
{
return $this->belongsToMany('App\User', 'user_likes', 'user_id', 'liked_user_id')
->where('is_mutual',1);
}
. Теперь давайте создадим контроллер для обработки пользовательской логики Likes c.
public function storeUserLikes(Request $request)
{
$user = Auth::user(); // Take the currently authenticated user
// Ofcourse, you should validate the $request
$likedUser = $request->likedUser;
// Let's findout if the other user already likes the current user
$isLikedAlready = UserLike::where([
'user_id' => $likedUser,
'liked_user_id' => $user->id,
])
->first();
// Store the user like record in the db
UserLike::create([
'user_id' => $user->id,
'liked_user_id' => $likedUser,
'is_mutual' => $isLikedAlready ? true : false
]);
// If the other user already likes the current user,
// they are a mutual connection.
// Update the row accordingly
if ($isLikedAlready) {
$isLikedAlready->is_mutual = true;
$isLikedAlready->save();
}
// Done! Now show a proper response to the User.
// I am leaving it to you :-)
}
Теперь давайте добавим маршруты
Auth::routes();
Route::group(['prefix' => 'user', 'middleware' => 'auth'], function ($router) {
$router->get('/like-user/{likedUser}', ['uses' => 'UserLikesController@storeUserLikes']);
});
Теперь добавьте пользователей в свою базу данных (для тестирования). Подробнее см. Laravel заполнение базы данных и завод.
Как это работает
Зарегистрированный пользователь может go до DOMAIN/user/like-user/x
понравиться пользователю. Где x - это идентификатор понравившегося пользователя.
Примечание. Я добавил маршрут get для удобства. Вы можете использовать методы POST / GET по вашему выбору.
Теперь давайте найдем список общих друзей из БД
Добавьте функцию к контроллеру UserLikes
.
/**
* This function will return a JSON Response with mutually liked users
* for the current logged in user.
**/
public function listLikedUsers()
{
$user = Auth::user();
return response()->json([
'status' => true,
'data' => $user->mutualFriends()->get()
]);
}
Теперь добавьте маршрут для получения взаимно понравившихся пользователей. Чуть ниже текущего маршрута добавьте следующий GET
маршрут $router->get('/likes', ['uses' => 'UserLikesController@listLikedUsers']);