Будь-який розробник, який працює з 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.
Прокоментуйте, будь ласка, дану статтю в формі коментування нижче!
WordPress роками був неперевершеним "монолітом": він відповідав і за зручну адмін-панель, і за збереження даних,…
У світі веб-серверів часто говорять про протистояння Nginx vs Apache. Але що, якби я сказав…
Коли я починав свій шлях у веб-розробці, питання "який веб-сервер використовувати?" практично не стояло. Відповідь…
Коли мова заходить про веб-сервери, два імені завжди на слуху: Apache та Nginx. Apache —…
У світі веб-розробки ми постійно стикаємося з проблемою: "А в мене на комп'ютері все працює!".…
На зорі моєї кар'єри веб-розробника все було відносно просто: встановив локальний сервер (пам'ятаєте Denwer?), поклав…