Будь-який розробник, який працює з 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.
Прокоментуйте, будь ласка, дану статтю в формі коментування нижче!
Якщо хочеш пізнати людину, не слухай, що про неї говорять інші, послухай, що вона говорить…
Вибачення — не означає, що ти не правий, а інша людина має рацію. Це всього…
Атмосферу паперової книги, запах свіжого чорнила і паперу, що трохи залежався, складно замінити гаджетами. Але…