Прелесть 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:

К концу этого руководства вы получите глубокое понимание отношений «многие ко многим» в Laravel Eloquent ORM, что позволит вам создавать более эффективные и гибкие структуры баз данных в ваших приложениях. Погрузитесь, чтобы открыть этот захватывающий аспект ORM Laravel!