Как обрабатывать пользовательские лайки другого пользователя c в Laravel? - PullRequest
2 голосов
/ 24 февраля 2020

Я хотел бы создать функциональность «лайки» в моем приложении, где один пользователь (пользователь1) может любить другого пользователя (пользователь2), а затем, если пользователь2 любит назад пользователя1, они будут соответствовать. Как лучше всего реализовать такую ​​логику c? Моя текущая идея примерно такая.

users_table

public function up()
  {
    Schema::create('users', function(Blueprint $table)
    {
      $table->increments('id');
      $table->string('email');
      $table->string('first_name');
      $table->string('last_name');
      $table->string('password', 60);
      $table->rememberToken()->nullable();
      $table->timestamps();
    });
  }

likes_users_table

public function up()
  {
    Schema::create('likes_users', function(Blueprint $table)
    {
      $table->integer('liked_user_id')->unsigned();
      $table->integer('user_id')->unsigned();

      $table->foreign('user_id')->references('id')->on('users');
      $table->foreign('liked_user_id')->references('id')->on('users');

      $table->primary(array('user_id', 'liked_user_id'));
    });
  }

User. php

public function likes()
{
    return $this->belongsToMany('User', 'likes_users', 'user_id', 'liked_user_id');
}

UserController. php

public function getIndex()
{
    $not_friends = User::where('id', '!=', Auth::user()->id);
    if (Auth::user()->likes->count()) {
      $not_friends->whereNotIn('id', Auth::user()->likes->modelKeys());
    }
    $not_friends = $not_friends->get();

    return View::make('dashboard.index')->with('not_friends', $not_friends);
}

public function add(User $user)
{
    $user->likes()->attach($user->id);
}

public function store($id)
{
    $user = User::find($id);
    Auth::user()->add($user);

    return Redirect::back();
}

Ответы [ 2 ]

2 голосов
/ 24 февраля 2020

Это быстрое решение. Может быть более эффективный способ сделать это 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']);

1 голос
/ 24 февраля 2020

Вы можете иметь сводный логический столбец (is_liked_back) в таблице likes_users. Таким образом, у вас будет только одна запись для лайков с обеих сторон.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...