Базы данных — это все об отношениях — связывании одного фрагмента данных с другим, создании обширной взаимосвязанной сети. Если вы разработчик Laravel, вы, несомненно, знаете о Eloquent: фантастическом, многофункциональном ORM Laravel, который упрощает работу с вашей базой данных. Но полностью ли вы используете его возможности, чтобы с изяществом справляться со сложными отношениями?
Понимание отношений в Laravel
В Laravel отношения Eloquent — это мощный инструмент, который позволяет вам легко определить, как ваши разные модели связаны друг с другом. Laravel поддерживает различные типы отношений, в том числе:
- "Один к одному"
- "Один ко многим"
- Многие ко многим
- Имеет один из многих
- Проходит через
- Прошло много
- Полиморфные отношения
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'); } }