Коварная война россии против Украины. Ориентировочные потери врага
(по состоянию на 18.11.2022)
83460
солдат
278
самолетов
261
вертолетов
2879
танков
5808
ББМ
1865
артиллерия
209
ПВО
393
РСЗО
4366
машин
16
корабли и катера
Основные трюки при работе с коллекцией товаров в Magento

Основные трюки при работе с коллекцией товаров в Magento

Любой разработчик, который работает с Magento, рано или поздно столкнется с коллекциями товаров. Практически для любого интернет-магазина на CMS Magento крайне важно правильно и эффективно использовать выборку, фильтрацию и сортировку товаров. В этой статье мы попробуем собрать основные сниппеты, которые будут полезны разработчикам Мадженто любого уровня при работе с коллекциями товаров.

 

 

Загрузка коллекции товаров

Существует два основных способа загрузки коллекции товаров. Вы можете вызывать метод getCollection() в экземпляре модели товара, либо загружать класс коллекции в фабричном методе getResourceModel().

$collection = Mage::getModel('catalog/product')->getCollection();
$collection = Mage::getResourceModel('catalog/product_collection');

 

 

Добавление атрибутов в коллекцию

Модель товара – это огромный набор данных, и чем больше атрибутов мы добавляем в выборку, тем дольше времени нужно для ее загрузки. По умолчанию Magento загружает только базовые данные, которые находятся в таблице catalog_product_entity (такие, как ID, SKU, идентификатор типа объекта и т.д.).

 

Добавление всех атрибутов в выборку

$collection->addAttributeToSelect('*');

 

Добавление некоторых атрибутов в выборку

$collection->addAttributeToSelect('name', 'description', 'brand');

 

Добавление атрибутов особых цен в выборку

$collection->addMinimalPrice();
$collection->addFinalPrice();
$collection->addTaxPercents();

 

Добавление идентификаторов категорий в выборку

$collection->addCategoryIds();

 

Добавление информации ценовых правил в выборку

$collection->addTierPriceData();

 

Добавление переадресации URL товара

$collection->addUrlRewrite();

 

 

 

Фильтрация коллекции товаров

Тип EAV сущности позволяет получать доступ к замечательному методу addAttributeToFilter() в дополнение к стандартному addFieldToFilter(), который может принимать более широкий диапазон аргументов.

Ниже перечислены основные условия для фильтра, которые используются в запросе MySQL:

 

РАВНО

$collection->addAttributeToFilter('status', array('eq' => 1));

 

НЕ РАВНО

$collection->addAttributeToFilter('visibility', array('neq' => 1));

 

БОЛЬШЕ ЧЕМ

$collection->addAttributeToFilter('price', array('gt' => 5));

 

МЕНЬШЕ ЧЕМ

$collection->addAttributeToFilter('price', array('lt' => 10));

 

БОЛЬШЕ ИЛИ РАВНО

$collection->addAttributeToFilter('price', array('gteq' => 15));

 

МЕНЬШЕ ИЛИ РАВНО

$collection->addAttributeToFilter('price', array('lteq' => 4));

 

СОДЕРЖИТ – % (подстановочные знаки)

$collection->addAttributeToFilter('sku', array('like' => 'COMP%'));

 

НЕ СОДЕРЖИТ – % (подстановочные знаки)

$collection->addAttributeToFilter('sku', array('nlike' => 'ABC%'));

 

СОДЕРЖИТСЯ В МАССИВЕ

$collection->addAttributeToFilter('entity_id', array('in' => array(1,5,15)));

 

НЕ СОДЕРЖИТСЯ В МАССИВЕ

$collection->addAttributeToFilter('entity_id', array('nin' => array(1,5,15)));

 

НУЛЕВОЙ

$collection->addAttributeToFilter('description', 'null');

 

НЕ НУЛЕВОЙ

$collection->addAttributeToFilter('description', 'notnull');

 

 

 

Фильтрация результатов

Вы также можете использовать следующие общие фильтры:

 

ФИЛЬТР ТОВАРОВ ПО ID

$collection->addIdFilter(array(100,250,501));

 

ФИЛЬТР ПО ТЕКУЩЕМУ МАГАЗИНУ

$collection->addStoreFilter();

 

ФИЛЬТР ПО ТЕКУЩЕМУ ВЕБ-САЙТУ

$collection->addWebsiteFilter();

 

ФИЛЬТР ПО КАТЕГОРИИ

$id = Mage::app()->getStore()->getStoreId(); // получаем ID магазина
$collection->setStoreId($id)->addCategoryFilter($category);

 

 

 

Сортировка коллекции

Полученные результаты выборки мы можем сортировать по выбранному атрибуту в порядке возрастания, убывания, или рандомно.

 

СОРТИРОВКА В ПОРЯДКЕ ВОЗРАСТАНИЯ

$collection->setOrder('price', 'ASC');

 

СОРТИРОВКА В ПОРЯДКЕ УБЫВАНИЯ

$collection->setOrder('name', 'DESC');

 

РАНДОМНАЯ СОРТИРОВКА

$collection->setOrder('rand()');

 

 

 

Ограничение для выборки коллекции

Если вам нужно получить коллекцию товаров, но вы хотите ограничить количество результатов до определенного лимита, вы можете использовать метод setPageSize() и передать в качестве аргумента лимит. Это особенно полезно, если ваша коллекция содержит сотни тысяч данных – так вам не нужно будет выполнять сложные операции с коллекцией такого размера.

Эта функция ограничивает количество возвращаемых результатов, используя, в основном, SQL запрос LIMIT X. Например:

$collection->setPageSize(105);

 

Похожий результат можно получить, если использовать другую конструкцию:

$collection->getSelect()->limit(50); // вернет первые 50 результатов

 

 

Если вам нужно получить определенное количество товаров с определенной стартовой точки, тогда используйте метод setPage(). Он позволяет указать два параметра: первый параметр – стартовая точка, второй – количество результатов. Этот метод формирует SQL запрос вида LIMIT 0,50. Например:

$collection->setPage(0,50); // вернет первые 50 товаров
$collection->setPage(25,10); // вернет 10 товаров после 25-го

 

 

Подсчет результатов

$collection->count();

 

 

Получение ID товаров
Иногда нужно получить только идентификаторы товаров из коллекции, но не другие данные товаров. Для этой цели вы можете использовать метод getAllIds().

$collection->getAllIds();

 

 

Отладка коллекции
Хотите знать, какой SQL запрос отправляется в базу данных? Используйте для этого метод getSelect().

$collection->getSelect();

 

 

 

Классы по работе с коллекциями в Magento очень эффективны, и они позволяют легко делать запросы и фильтрацию данных, даже без каких-либо знаний MySQL.

Прокомментируйте, пожалуйста, данную статью в форме комментирования ниже!

 

 

2 комментария для «Основные трюки при работе с коллекцией товаров в Magento»

  1. Виталий

    Фантастика! Коротко, информативно и очень-очень полезно! Прекрасная шпаргалка! Большое спасибо за ваш труд:)

Добавить комментарий

Ваш адрес email не будет опубликован.