Кешируем на 5 минут запрос к инфоблоку для получения 20 последних активных товаров с информацией об их категориях, используя ORM-кеш для оптимизации производительности.
| Код |
|---|
<?php
// Пример кешированного запроса ORM для получения списка активных товаров с привязкой к категориям
use Bitrix\Main\Loader;
use Bitrix\Iblock\ElementTable;
use Bitrix\Iblock\SectionElementTable;
use Bitrix\Iblock\SectionTable;
use Bitrix\Main\ORM\Fields\Relations\Reference;
use Bitrix\Main\ORM\Query\Join;
if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true) die();
Loader::includeModule('iblock');
$result = ElementTable::getList([
'select' => [
'ID',
'NAME',
'CODE',
'ACTIVE_FROM',
'SECTION_NAME' => 'SECTION.NAME',
'SECTION_CODE' => 'SECTION.CODE'
],
'filter' => [
'=IBLOCK_ID' => 2,
'=ACTIVE' => 'Y',
'<=ACTIVE_FROM' => new \Bitrix\Main\Type\DateTime(),
[
'LOGIC' => 'OR',
['>=ACTIVE_TO' => new \Bitrix\Main\Type\DateTime()],
['ACTIVE_TO' => null]
]
],
'runtime' => [
new Reference(
'SECTION_ELEMENT',
SectionElementTable::class,
Join::on('this.ID', 'ref.IBLOCK_ELEMENT_ID'),
['join_type' => 'INNER']
),
new Reference(
'SECTION',
SectionTable::class,
Join::on('this.SECTION_ELEMENT.IBLOCK_SECTION_ID', 'ref.ID'),
['join_type' => 'LEFT']
)
],
'order' => ['ACTIVE_FROM' => 'DESC'],
'limit' => 20,
'cache' => [
'ttl' => 300,
'cache_joins' => true
]
]);
$products = [];
while ($product = $result->fetch()) {
$products[] = $product;
}
// Использование данных
foreach ($products as $product) {
echo "{$product['NAME']} (Категория: {$product['SECTION_NAME']})<br>";
} |