Только учится
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
использование:
- Например, чтобы запросить всех поклонников текущего пользователя:
$fans = Auth::user()->fans;
Ничего себе, что это значит? На самом деле, это эквивалентно
$fans = Auth::user()->fans()->get();
- Вау, этот человек действительно большой, я хочу следовать за ней
до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]); //上面说过模型也是主键
}
- Нет, я вдруг подпишусь не на того человека, я хочу отписаться от этого человека.
то же самое, первое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]);
}
Таким образом, завершается модель ассоциации «многие ко многим», и она является специальной. Это понятно, другие связанные модели должны быть в порядке ~