Категории: 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.

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

 

Share

Последние посты

Антуан де Сент-Экзюпери

Никогда не теряй терпения — это последний ключ, отпирающий двери Антуан де Сент-Экзюпери   Читать далее

28/03/2024

Сомерсет Моэм

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

27/03/2024

Михаил Грушевский

Все учатся своему родному языку, а наша беда такова, что нужно учить его больше, чем… Читать далее

26/03/2024

ТОП-5 надежных покерных обменников

Профессиональный покер – это многочисленные турниры и крупные суммы, что требует правильной настройки финансовых инструментов.… Читать далее

25/03/2024

Гай Юлий Цезарь

Все вокруг стремятся истребить врагов, но не объединиться с друзьями Гай Юлий Цезарь   Читать далее

24/03/2024

Как выбрать оптимальный смартфон для ребенка?

Сегодняшние дети сталкиваются с технологиями с самого раннего возраста, и смартфон уже давно перестал быть… Читать далее

22/03/2024