Базы данных — это все об отношениях — связывании одного фрагмента данных с другим, создании обширной взаимосвязанной сети. Если вы разработчик Laravel, вы, несомненно, знаете о Eloquent: фантастическом, многофункциональном ORM Laravel, который упрощает работу с вашей базой данных. Но полностью ли вы используете его возможности, чтобы с изяществом справляться со сложными отношениями?

Понимание отношений в Laravel

В Laravel отношения Eloquent — это мощный инструмент, который позволяет вам легко определить, как ваши разные модели связаны друг с другом. Laravel поддерживает различные типы отношений, в том числе:

  1. "Один к одному"
  2. "Один ко многим"
  3. Многие ко многим
  4. Имеет один из многих
  5. Проходит через
  6. Прошло много
  7. Полиморфные отношения
    1. Один к одному
    2. Один ко многим
    3. Один из многих
    4. Многие ко многим

В каждой теме есть ссылка на другой мой пост, в котором более подробно рассматриваются все отношения.

1. Отношения один на один

Самый простой тип отношений — отношения один на один. Например, у пользователя может быть один телефон.

class User extends Model
{
    public function phone()
    {
        return $this->hasOne(Phone::class);
    }
}

2. Отношения один ко многим

Еще один распространенный тип связи — «один ко многим». Например, у одного поста может быть много комментариев.

class Post extends Model
{
    public function comments()
    {
        return $this->hasMany(Comment::class);
    }
}

3. Отношения «многие ко многим»

Все становится интереснее с отношениями «многие ко многим». Например, у пользователя может быть много ролей, а роль может принадлежать многим пользователям.

class User extends Model
{
    public function roles()
    {
        return $this->belongsToMany(Role::class);
    }
}

4. Имеет одного через отношения

Отношение «Имеет один через» обеспечивает быстрый доступ к удаленным отношениям через отношение-посредник. Например, у механика может быть один владелец через автомобиль.

class Mechanic extends Model
{
    public function owner()
    {
        return $this->hasOneThrough(Owner::class, Car::class);
    }
}

5. Имеет много благодаря отношениям

Отношение «Имеет много сквозных» является дальнейшим расширением отношения «Имеет одно сквозное», но для коллекций сущностей. Например, у Страны может быть много Сообщений от Пользователей.

class Country extends Model
{
    public function posts()
    {
        return $this->hasManyThrough(Post::class, User::class);
    }
}

6. Полиморфные отношения

Наконец, у нас есть полиморфные отношения, которые позволяют модели принадлежать более чем одному другому типу модели в одной ассоциации. Например, и у поста, и у видео может быть много комментариев.

class Comment extends Model
{
    public function commentable()
    {
        return $this->morphTo();
    }
}

class Post extends Model
{
    public function comments()
    {
        return $this->morphMany(Comment::class, 'commentable');
    }
}

class Video extends Model
{
    public function comments()
    {
        return $this->morphMany(Comment::class, 'commentable');
    }
}