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

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

 

View Comments

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

Recent Posts

Роберт Шекли

Самое обидное, что в информационной войне всегда проигрывает тот, кто говорит правду, ведь он ограничен…

5 часов ago

Ричард Бах

Если тебе когда-нибудь захочется найти такого человека, который сможет одолеть любую, даже самую тяжелую беду…

1 день ago

Что такое CDN и почему он нужен вашему сайту | обзор в 2025

Представьте себе, что вы открыли пиццерию в Киеве. Ваша пицца настолько вкусна, что ее хотят…

5 дней ago

Что такое Varnish Cache и как он ускорит ваш сайт (начинающим)

Представьте, что ваш сайт – это большая библиотека, а ваш сервер – это главный библиотекарь.…

6 дней ago

Что такое WAF (Web Application Firewall) и почему без него сайт в опасности

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

1 неделя ago

Что такое DDoS-атака и как защитить свой сайт

Представьте себе, что ваш сайт или онлайн-сервис внезапно перестает работать. Клиенты не могут войти, заказы…

1 неделя ago