Основные трюки при работе с коллекцией товаров в 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.
Прокомментируйте, пожалуйста, данную статью в форме комментирования ниже!
Последние посты
Самые красивые и впечатляющие мосты со всего мира (ТОП-10)
Мост — это нечто большее, чем просто сооружение, соединяющее два берега. Для того, чтобы появился… Читать далее
Соломон
Жизнь нас учит, что свою пару мы познаем, когда разводимся, своих братьев мы познаем, когда… Читать далее
Чак Паланик
Кто может — тот делает. Кто не может — тот критикует Чак Паланик Читать далее
Ричард Бах
Ни одно желание не дается тебе отдельно от силы, позволяющей его осуществить. Хотя, возможно, для… Читать далее
Стивен Кинг
Жизнь – это непрерывный опыт, и даже самые плохие моменты занимают свое место в пазле… Читать далее
неизвестный автор
Люди, которые любят одиночество, дорого заплатили за дружбу с кем-то... неизвестный автор Читать далее