magento
Как фильтровать коллекции
Поиск…
параметры
параметр | подробности |
---|---|
$ addFieldToFilter ( $ field , $ condition = null) | {string} Поле, добавляемое в фильтр. |
$ addFieldToFilter ($ field, $ condition = null ) | {mixed} Определение фильтра, который мы будем использовать. |
addAttributeToFilter ( $ attr , $ condition = null, $ join = 'inner') | {string} Поле, добавляемое в фильтр. |
addAttributeToFilter ($ attr, $ condition = null , $ join = 'inner') | {mixed} Определение фильтра, который мы будем использовать. |
addAttributeToFilter ($ attr, $ condition = null, $ join = 'inner' ) | {('inner', 'left')} Тип соединения sql для использования при подключении таблицы EAV. |
замечания
Аргументы сравнения фильтров
Magento также предлагает гибкий способ фильтрации с использованием операторов сравнения. Вот список действительных операторов и их синтаксис:
Все сравнительные аргументы могут быть переданы во второй параметр методов addFieldToFielter()
или addAttributeToFilter()
.
$collection_of_products->addAttributeToFilter('visible',array("eq"=>1));
сравнение | Argument Array | Результат SQL Snippet |
---|---|---|
Равно | массив ( "эк" => $ вар) | WHERE (`my_field` = $ var) |
Не равный | массив ( "NEQ" => $ вар) | WHERE (`my_field`! = $ Var) |
подобно | массив ( "как" => $ вар) | WHERE (`my_field` LIKE $ var) |
Не как | массив ( "Nlike" => $ вар) | WHERE (`my_field` НЕ НРАВИТСЯ $ var) |
Является | массив ( "есть" => $ вар) | WHERE (`my_field` IS $ var) |
В | массив ( "в" => $ вар) | WHERE (`my_field` IN ($ var)) |
Не в | массив ( "нин" => $ вар) | WHERE (`my_field` NOT IN ($ var)) |
Ноль | массив ( "нуль" => правда) | WHERE (`my_field` IS NULL) |
Ненулевой | массив ( "NotNull" => правда) | ГДЕ (`my_field` НЕ НЕТ) |
Лучше чем | Массив ( "GT" => $ вар) | WHERE (`my_field`> $ var) |
Меньше, чем | Массив ( "л" => $ вар) | WHERE (`my_field` <$ var) |
Больше или равно | массив ( "gteq" => $ вар) | WHERE (`my_field`> = $ var) |
Меньше или равно | массив ( "lteq" => $ вар) | WHERE (`my_field` <= $ var) |
Найти в Set | массив ( "finset" => массив ($ Var)) | WHERE (find_in_set ($ var, `my_field`) |
От и до | array ("from" => $ var1, "to" => $ var2) | WHERE (`my_field`> = $ var1 AND` my_field` <= $ var2) |
Фильтрация коллекций
Magento обладает мощным набором методов для фильтрации коллекций. Поскольку существует два типа объектов, которые могут содержаться в коллекциях, мы должны сначала определить, с каким типом данных мы работаем, прежде чем мы сможем его фильтровать. Magento реализует модель данных EAV для таких объектов, как продукты и категории. Существует другой набор методов для использования, если мы фильтруем коллекцию объектов EAV.
В Magento Заказы не сохраняются как объекты EAV. Это делает коллекцию заказов хорошим примером для фильтрации основной коллекции.
$collection_of_orders = Mage::getModel('sales/order')->getCollection();
$collection_of_orders->addFieldToFilter('status','processing');
Если мы посмотрим на коллекцию продуктов, мы увидим, что продукты хранятся в модели данных EAV. Мы также можем легко фильтровать атрибуты EAV.
$collection_of_products = Mage::getModel('catalog/product')->getCollection();
$collection_of_products->addAttributeToFilter('visible',1);
Обработка AND и OR в фильтрах
Когда мы запрашиваем наши данные, нам часто требуется более одного фильтра, чтобы получить точный набор данных, который мы ищем. В SQL мы обрабатываем это с помощью предложений AND и OR. Мы можем сделать то же самое с коллекциями.
Чтобы добавить предложение AND к вашему запросу, просто добавьте другой вызов метода. Это добавит второй фильтр к исходному оператору WHERE, соединяющему его с AND.
Mage::getModel('catalog/product')->getCollection()
->addFieldToFilter('sku',array('like'=>'a%'))
->addFieldToFilter('sku',array('like'=>'%b'));
В результате предложение WHERE будет выглядеть так:
WHERE (e.sku like 'a%') AND (e.sku like '%b')
Теперь давайте скажем, что мы хотим, чтобы все skus начинались с 'a' OR end с 'b'. Как мы добавляем предложение OR? Благодаря коллекциям Magento это довольно прямолинейно. Мы добавляем фильтр как второй элемент в массив фильтров.
Mage::getModel('catalog/product')->getCollection()
->addFieldToFilter('sku', array(
array('like'=>'a%'),
array('like'=>'%b')
));
Теперь получившееся предложение WHERE будет выглядеть так:
WHERE (((e.sku like 'a%') or (e.sku like '%b')))