Я использовал много-много отношений в моей пользовательской таблице, чтобы заставить зарегистрированного пользователя следовать другому, но я сам не выяснил его, я проверил, что сделали другие, и попытался сделать что-то подобное, и это сработало. В моих методах у меня есть:
function follow(User $user) {
$this->followers()->attach($user->id);
}
function unfollow(User $user) {
$this->followers()->detach($user->id);
}
что позволяет мне следовать.
таблицы связаны с функцией что-то вроде:
return $this->belongsToMany('App\User', 'followers', 'user_id', 'follower_id');
теперь я передаю значение $user
контроллером, а контроллер довольно прост:
$userId = User::find($user);
$willfollow = Auth::user();
$willfollow->unfollow($userId);
Я знаю, что информация о контроллере, вероятно, не нужна, но в случае, если легко проверить отношение внутри контроллера, я бы предпочел сделать это таким образом, потому что я, очевидно, не так много знаю о применении метода.
Я использую Laravel 5.4.
Начиная с Laravel 5.3 вы можете использовать syncWithoutDetaching (наиболее эффективный):
$this->followers()->syncWithoutDetaching([$user->id]);
Другие способы:
$this->followers()->sync([$user->id], false);
Проверить наличие существующего перед сохранением (эффективный, только если вы уже загрузили $this->followers
):
function follow(User $user) {
if(!$this->followers->contains($user)) {
$this->followers()->attach($user->id);
}
}
syncWithoutDetaching
- самый эффективный способ сделать это с помощью Laravel / Eloquent