Laravel. Вы действительно знакомы с реляционными моделями?

задняя часть база данных Laravel

Только учитсяthinkphpиlaravelСтруктура ассоциативного запроса более предпочтительнаlaravelСпособ написания, поэтому здесь я говорю о своем мненииlaravelИспользуйте ассоциативную модель.

Например: отношения между пользователями и пользователями, подписчиками и фанатами.

Проще говоря, пользователь может подписаться на нескольких людей, а у пользователя также может быть несколько подписчиков, поэтому между ними существует связь «многие ко многим».
Нечего сказать, сначала создайте таблицу с миграцией базы данных. (здесьusersСтруктура таблицы миграции имеет по умолчанию)

$ php artisan make:migration create_followers_table --create="followers"

Откройте только что созданныйdatabase/migrations/..create_followers_table.phpВнесите следующие изменения.

.
.
public function up() {
    Schema::create('followers', function(Blueprint $table) {
        $table->increments('id');
        $table->integer('user_id')->index();
        $table->integer('follower_id')->index();
        $table->timestamps();
    });
}
.
.

Поля таблицы миграции настроены, выполните миграцию

php artisan migrate

генерируется в базе данныхfollowersстол, следующий начинается сUserОтношения прописаны в модели.
открой свою модельuser.php

.
.
//一个用户拥有多个粉丝
public function fans() {
    return $this->belongsToMany(User::class, 'followers', 'user_id', 'follower_id');
}

//一个用户可以关注多个大佬
public function followings() {
    return $this->belongsToMany(User::class, 'followers', 'follower_id', 'user_id');
}

объясните здесьbelongsToManyМетод имеет четыре параметра:
Первый параметр — это связанная модель, которая должна бытьUserМодель, ничего не скажешь.
Второй параметр — это имя таблицы, здесь имя моей промежуточной таблицыfollowers
Третий параметр — это имя внешнего ключа модели, установленной в связанной модели. взять первыйfans()С точки зрения непрофессионала, это чтобы получить список поклонников, так что вы принадлежите кuser_idОтношение. ты неfollower_id
Четвертый параметр — это имя внешнего ключа модели, которую вы хотите объединить, то есть имя внешнего ключа нужной вам модели, или взятьfans()С точки зрения метода, вам нужна ассоциация для слияния запросов с поклонниками, поэтому внешний ключfollower_id

использование:

  1. Например, чтобы запросить всех поклонников текущего пользователя:
$fans = Auth::user()->fans;

Ничего себе, что это значит? На самом деле, это эквивалентно

$fans = Auth::user()->fans()->get();
  1. Вау, этот человек действительно большой, я хочу следовать за ней
    доUser.phpМодель имеет следующий логический код:
//模型里的判断是否关注的方法
private function isFollowing($user_id) {
    return $this->followings->pluck('id')->contains($user_id);
}
//模型里的关注方法
public function follow($user_ids) {
    //如果$user_ids不是数组
    if(!is_array($user_ids)) {
        $user_ids = compact($user_ids); //转化为数组
    }
    
    $this->followings()->sync($user_ids, false);
}

Объясните два вышеуказанных метода.
Во-первых,$this->followingsКак я сказал в пункте 1, узнайте соответствующийuserВсе большие парни, которые следуют.
Далее используем найденную коллекцию для вызова метода коллекцииpluck('id')вынуть всеid,
продолжать звонитьcontains($user_id)посмотрите, содержит ли он$user_id
Скин сюда:

return $this->followings->pluck('id')->contains($user_id);
//等价于
return $this->followings->contains($user);
//至于为什么呢?  因为laravel里模型会对应到主键,我是这么理解的

Тогда немного логики:

  • Может быть, этот большой парень - ты сам, ты, должно быть, страдаешь амнезией.
  • Судите сами, следили ли вы за ней, может быть, вы забыли, да?
  • Нет проблем, просто следите за ним.
    Напишите метод беспокойства в контроллере по логике:
public function store(User $user) {
    //说不定这个大佬是你自己,你肯定患了健忘症
    if(Auth::id() === $user->id) {
        return redirect('/');
    }
    //判断是否已经关注了她,可能你忘了对吧
    if(Auth::user()->isFollowing($user->id)) { //模型里判断是否关注的方法
        session()->flash('notice', '你已经关注过他了哟,不需要重复关注');  
        return redirect()->back();
    }
     Auth::user()->follow($user->id); //模型里的关注方法
    return redirect()->route('users.show', [$user]);    //上面说过模型也是主键
}
  1. Нет, я вдруг подпишусь не на того человека, я хочу отписаться от этого человека.
    то же самое, первоеUserНапишите методы в модели.
public function unfollow($user_ids) {
    //如果不是数组
    if(!is_array($user_ids)) {
        $user_ids = compact($user_ids);
    }
    
    $this->followings()->detach($user_ids);
}

Тогда есть несколько логик ниже:

  • Может быть, этот большой парень - ты сам, ты, должно быть, страдаешь амнезией.
  • Ты вообще ни на кого не обращал внимания, да?
  • нет проблем, отписаться
public function destroy(User $user) {
    //说不定这个大佬是你自己,你肯定患了健忘症
    if(Auth::id() === $user->id) {
        return redirect('/');
    }
    //你根本就没关注过别人好吗
    if(!Auth::user()->isFollowing($user->id)) {
        session()->flash('notice', '你还没有关注过他哟,不需要取消关注');  
        return redirect()->back();
    }
    //没问题了,取消关注吧
    Auth::user()->unfollow($user->id);
    return redirect()->route('users.show', [$user]);
}

Таким образом, завершается модель ассоциации «многие ко многим», и она является специальной. Это понятно, другие связанные модели должны быть в порядке ~