Дисциплины - Разработка веб-приложений

Начало разработки - База данных и модели - Связи моделей

Связи моделей

Eloquent предлагает встроенный механизм связывания моделей. Вот поддерживаемые типы связей:

  • One to One
  • One to Many
  • One to Many (Inverse)
  • Many to Many
  • Has Many Through
  • Polymorphic Relations
  • Many To Many Polymorphic Relations

Для реализации связи модели с другой моделью, необходимо создать метод, возвращающий нужный тип связи. Пример связи: Каталог содержит множество продуктов:

    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 связывает две необходимые модели через промежуточную таблицу, для которой даже нет необходимости создавать модель.

Количество комментариев: 0

Для того, чтобы оставить коментарий необходимо зарегистрироваться