Связи моделей
Eloquent предлагает встроенный механизм связывания моделей. Вот поддерживаемые типы связей:
Для реализации связи модели с другой моделью, необходимо создать метод, возвращающий нужный тип связи. Пример связи: Каталог содержит множество продуктов:
public function products(){ return $this->hasMany(Catalog::class, 'parent_id'); }
Пример обратной связи в модели Product. Продукт принадлежит каталогу:
public function catalog(){ return $this->belongsTo(Catalog::class); }
Метод with используется для быстрой загрузки связанных данных, чтобы уменьшить количество запросов к базе данных при получении данных.
$products = Product::with('catalogs')->get(); foreach ($products as $product) { echo $book->author->name; }
Результирующий sql-запрос будет примерно таким:
select * from products select * from catalogs where id in (1, 2, 3, 4, 5, …)
Разница между hasMany hasManyThrough
Причём, hasMany и hasManyThrough используются в разных случаях:
hasMany: устанавливает связь «один ко многим» между двумя моделями напрямую. Например, у пользователя много сообщений. Используется, когда между двумя моделями существует прямая связь.
hasManyThrough: используется, когда существует промежуточная модель, соединяющая две другие модели. Он часто используется для сложных отношений, когда чтобы получить нужные связанные данные, необходимо пройти через несколько таблиц. Например, пользователь может иметь много публикаций посредством модели подписки. Или Каталог содержит множество товаров и каждый товар может присутствовать во множестве каталогов. В таких случаях создаётся промежуточная таблица, в которой хранятся данные связей, и метод hasManyThrought связывает две необходимые модели через промежуточную таблицу, для которой даже нет необходимости создавать модель.
Практика