Практика
Любой разработчик, который использует CMS Magento, рано или поздно вынужден погрузиться в коллекции моделей. Очень часто работать приходиться с коллекцией характеристик продукта (product resource collection). В этой статье разберем основы касаемо загрузки, фильтрации, сортировки и модификации данной коллекции.
Загрузка коллекции продуктов
Существует два основных способа загрузки коллекции продуктов. С помощью метода getCollection() из экземпляра модели продукта или загрузка класса коллекции с помощью фабричного метода getResourceModel().
1
2
|
$collection = Mage::getModel('catalog/product')->getCollection();
$collection = Mage::getResourceModel('catalog/product_collection');
|
Добавляем атрибуты к коллекции
Модель продукта – огромный набор данных. Чем больше атрибутов модели используется для выборки, тем дольше она будет выполняться. По умолчанию, с помощью вышеупомянутых способов CMS Magento загружает только основные данные, найденные в таблице
1
|
'catalog_product_entity' (ID, SKU, Entity Type ID и т.д.).
|
Для добавления всех атрибутов используют:
1
|
$collection->addAttributeToSelect('*');
|
Для отдельных атрибутов:
1
|
$collection->addAttributeToSelect('name', 'description', 'sku');
|
Для специфичных атрибутов:
1
2
3
|
$collection->addFinalPrice();
$collection->addMinimalPrice();
$collection->addTaxPercents();
|
Добавляем ID категории к продуктам:
1
|
$collection->addCategoryIds();
|
Многоуровневое ценообразование (tier pricing):
1
|
$collection->addTierPriceData();
|
Добавляем URL Rewrites к продуктам:
1
|
$collection->addUrlRewrite();
|
Фильтруем результаты
Используя EAV тип сущностей системы, можно получить доступ к удивительному методу ‘addAttributeToFilter()’. Например:
1
|
$collection->addAttributeToFilter('sku', array('eq' => '0,7л_34567'));
|
также можно записать:
1
|
$collection->addAttributeToFilter('sku', '0,7л_34567');
|
Этот метод используется как дополнение к стандартному методу ‘addFieldToFilter()’ из Zend-библиотеки Varien_Data_Collection_Db и принимает большое количество аргументов. Эти аргументы представлены в виде выражений и схожи по своей природе с запросами SQL. Приведем пример таких выражений в Magento и равноценного использования выборки данных (SQL) с ключевым словом ‘WHERE’:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
array("eq" => '0,7л_34567') WHERE (sku = '0,7л_34567')
array("neq" => '0,7л_34567') WHERE (sku <> '0,7л_34567')
array("like" => '0,7л_34567') WHERE (sku LIKE '0,7л_34567')
array("nlike" => '0,7л') WHERE (sku NOT LIKE '0,7л')
array("is" => '0,7л') WHERE (sku IS '0,7л')
array("in" => array('0,7л', '34567')) WHERE (sku IN ('0,7л', '34567'))
array("nin" => array('0,7л', '34567')) WHERE (sku NOT IN ('0,7л', '34567'))
array("notnull" => true) WHERE (sku IS NOT NULL)
array("null" => true) WHERE (sku IS NULL)
array("gt" => 3) WHERE (sku > 3)
array("lt" => 5) WHERE (sku < 5) array("gteq" => 4) WHERE (sku >= 4)
array("lteq" => 2) WHERE (sku =< 2) array("finset" => array('_34567')) WHERE (find_in_set('_34567', sku))
array('from' => 2, 'to' => 10) WHERE (sku >= '2' AND sku <= '10') Для более детального ознакомления следует прочитать про стандартный метод 'addFieldToFilter()'. Фильтруем результаты по ID продукта: $collection->addIdFilter(array(4,5,6));
|
Фильтр по текущему магазину (store):
1
|
$collection->addStoreFilter();
|
Фильтр по текущему вебсайту (website):
1
|
$collection->addWebsiteFilter();
|
Фильтр по категории:
1
|
$collection->setStoreId($id)->addCategoryFilter($category);
|
Сортировка коллекции
Снова, как и в случае с SQL, вы можете отсортировать коллекцию по выбранному атрибуту в порядке возрастания или убывания.
Сортировка по возрастанию:
1
|
$collection->setOrder('price', 'ASC');
|
Сортировка по убыванию:
1
|
$collection->setOrder('name', 'DESC');
|
Случайный порядок:
1
|
$collection->setOrder('rand()');
|
Ограничение выборки
Если наступит ситуация в которой необходимо ограничить количество продуктов загружаемой коллекции, можно задействовать метод ‘setPageSize()’:
1
|
$collection->setPageSize(10);
|
Количество продуктов
Всегда полезно проверять возвратились ли результаты после загрузки коллекции и сколько продуктов в коллекции:
1
2
3
4
|
$collection->count();
Выборка списка идентификаторов продуктов
Иногда просто нужно получить идентификаторы продукта из коллекции, а не все остальные атрибуты. Это просто сделать с помощью вызова метода:
|
1
|
$collection->getAllIds();
|
Отладка коллекции
Хотите знать, почему и как коллекция выполняет возвращение результатов? Применяя метод ‘getSelect()’ для коллекции, вы можете вывести все запросы MySQL, которые отправляются в базу данных.
1
|
$collection->getSelect();
|
Классы коллекций моделей в Magento являются чрезвычайно мощными инструментами и существенно упрощают выполнение запросов и фильтрацию данных, даже без каких-либо знаний MySQL.
Комментарии
Оставить комментарий
Выполнение скриптов на стороне сервера PHP (LAMP) NodeJS (Backend)
Термины: Выполнение скриптов на стороне сервера PHP (LAMP) NodeJS (Backend)