Основные трюки при работе с коллекцией товаров в 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.
Прокомментируйте, пожалуйста, данную статью в форме комментирования ниже!
Виталий
Фантастика! Коротко, информативно и очень-очень полезно! Прекрасная шпаргалка! Большое спасибо за ваш труд:)
ZAnatoly
Спасибо за вашу высокую оценку!