Прелесть Laravel заключается в его бесшовном взаимодействии с базами данных через Eloquent ORM. Эта статья направлена на то, чтобы раскрыть отношения «многие ко многим» в Eloquent. Например, рассмотрим приложение, в котором пользователи могут иметь несколько ролей, и эти роли также могут быть связаны с несколькими пользователями. Такие сценарии требуют отношений «многие ко многим».
Понимание отношений «многие ко многим»
Отношения «многие ко многим» немного сложнее, чем отношения hasOne и hasMany. Типичным примером является случай, когда пользователю назначено несколько ролей, таких как «Автор» и «Редактор», которыми можно поделиться с другими пользователями.
Структура таблицы базы данных для отношений «многие ко многим»
Для определения отношения «многие ко многим» необходимы три таблицы базы данных: users
, roles
и промежуточная таблица (также известная как сводная таблица) role_user
. Таблица role_user
названа путем объединения имен связанных таблиц модели в алфавитном порядке. Он содержит столбцы user_id
и role_id
для связи пользователей и ролей.
Структура этих таблиц может быть следующей:
users id - integer name - string roles id - integer name - string role_user user_id - integer role_id - integer
Определение отношения «многие ко многим» в моделях Eloquent
Отношения «многие ко многим» в Laravel определяются с помощью метода belongsToMany
. Вот как вы бы определили отношения roles
в модели User
:
namespace App\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsToMany; class User extends Model { /** * The roles that belong to the user. */ public function roles(): BelongsToMany { return $this->belongsToMany(Role::class); } }
Имея связь, вы можете получить доступ к ролям пользователя, используя динамическое свойство roles
:
use App\Models\User; $user = User::find(1); foreach ($user->roles as $role) { // ... }
Вы можете добавить дополнительные ограничения к запросу отношений, вызвав метод roles
и связав условия с запросом:
$roles = User::find(1)->roles()->orderBy('name')->get();
Определение обратной зависимости
Если вы не знаете, почему и насколько важно определить обратную связь, вы можете проверить эту статью.
«Инверсия» отношения «многие ко многим» определяется аналогично своему аналогу. В нашем примере мы определим метод users
для модели Role
:
namespace App\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsToMany; class Role extends Model { /** * The users that belong to the role. */ public function users(): BelongsToMany { return $this->belongsToMany(User::class); } }
Остальная часть этого всеобъемлющего руководства доступна в следующих разделах непосредственно из документации Laravel:
- Извлечение столбцов промежуточной таблицы
- Настройка имени атрибута
pivot
- Фильтрация запросов по столбцам промежуточной таблицы
- Упорядочивание запросов через столбцы промежуточной таблицы
- Определение пользовательских моделей промежуточных таблиц
К концу этого руководства вы получите глубокое понимание отношений «многие ко многим» в Laravel Eloquent ORM, что позволит вам создавать более эффективные и гибкие структуры баз данных в ваших приложениях. Погрузитесь, чтобы открыть этот захватывающий аспект ORM Laravel!