Основные трюки при работе с коллекцией товаров в 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.

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