Метод belongsToMany
Метод belongsToMany используется для определения
связи многие-ко-многим между двумя моделями Eloquent.
Первый параметр принимает имя связанной модели,
второй - имя промежуточной таблицы,
третий - внешний ключ текущей модели,
четвёртый - внешний ключ связанной модели.
Если имена таблиц и ключей соответствуют соглашениям
Laravel, можно передать только первый параметр.
Синтаксис
<?php
Model::belongsToMany(RelatedModel::class, $table, $foreignPivotKey, $relatedPivotKey);
?>
Пример
Давайте определим связь между моделями User и
Role через таблицу role_user:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
class User extends Model
{
public function roles(): BelongsToMany
{
return $this->belongsToMany(Role::class);
}
}
?>
Аналогично определяем связь в модели Role:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
class Role extends Model
{
public function users(): BelongsToMany
{
return $this->belongsToMany(User::class);
}
}
?>
Пример
Теперь получим все роли пользователя с id равным 1:
<?php
use App\Models\User;
$user = User::find(1);
$roles = $user->roles;
foreach ($roles as $role) {
echo $role->name;
}
?>
Результат выполнения кода:
["admin", "editor", "viewer"]
Пример
Получим пользователей, у которых роль admin:
<?php
use App\Models\Role;
$role = Role::where('name', 'admin')->first();
$users = $role->users;
foreach ($users as $user) {
echo $user->name;
}
?>
Результат выполнения кода:
["John Doe", "Jane Smith", "Bob Johnson"]
Пример
Добавим новую роль пользователю с помощью метода attach:
<?php
use App\Models\User;
use App\Models\Role;
$user = User::find(1);
$role = Role::where('name', 'moderator')->first();
$user->roles()->attach($role->id);
?>
Удалим роль у пользователя с помощью метода detach:
<?php
use App\Models\User;
$user = User::find(1);
$user->roles()->detach(3);
?>
Пример
Синхронизируем роли пользователя с помощью метода sync:
<?php
use App\Models\User;
$user = User::find(1);
$user->roles()->sync([1, 2, 3]);
?>