Допустим, у нас есть две «связанные» таблицы.
Таблица Категорий и таблица Продуктов.
В одной категории может быть много продуктов (один ко многим).
Каждый продукт привязан к одной категории (один к одному), полем parent который указывает на поле id таблицы Категорий.
С помощью отложенной или жадной загрузки мы можем, например, получить все товары, тогда когда получаем каталог (млм все каталоги). То-есть нам не нужно сначала делать запрос в каталог и только потом в товары. Запрос в товары произойдет автоматически при запросе каталога.
Открываем модель категорий
и прописываем заимосвязь один ко многим (hasMany).
Код:
class Category extends ActiveRecord
{
public static function tableName()
{
return 'products';
}
public function getProducts(){
return $this->hasMany(Product::className(), ['parent' => 'id']);
}
}
Открываем модель товаров
и прописываем заимосвязь один к одному (hasOne).
Код:
class Product extends ActiveRecord
{
public static function tableName()
{
return 'products';
}
public function getCategories(){
return $this->hasOne(Category::className(), ['id' => 'parent']);
}
}
Далее в контроллере (например) запросим все категории.
$cats = Category::find()->all();
передадим в нашу вьюшку (например show)
return $this->render(‘show’, compact(‘cats’));
Ну а во вьюшке все выведем.
Код:
foreach ($cats as $cat){
echo '<ul>';
echo '<li>' . $cat->title . '</li>';
$products = $cat->products; //в этом месте мы используем созданную нами связь (getProducts)
foreach ($products as $product){
echo '<ul>';
echo '<li>' . $product->title . '</li>';
echo '</ul>';
}
echo '</ul>';
}
Вывели категирии с продуктами в данном случае мы отложенной загрузкой.
Что значить отложенной? Это значить что на каждую позицию (категорию) был сделан отдельный запрос в базу данных. Если у нас много категорий, например 50. То и запросов в базу будет 50. Чтобы сократить количество однотипных запросов в один запрос, нужно использовать (рекомендуется) жадную загрузку.
Для реализации жадной загрузки нам нужно всего лишь указать связь в нашем запросе, который мы делали в контроллере.
Было (отложенная)
$cats = Category::find()->all();
Меняем на жадную
$cats = Category::find()->with(‘products’)->all();
Жадную загрузку нужно использовать в том случае, если запрос по большому количеству данных. В ином случае используем отложенную (ленивую) загрузку.