Колекція Magento має два способи фільтрування внизу різних
- Varien_Data_Collection_Db :: addFieldToFilter
addFieldToFilter ($ поле, $ умова = null)
Перший параметр addFieldToFilter
- це атрибут, за яким ви хочете відфільтрувати. Друга - цінність, яку ви шукаєте. Ось ми додаємо sku
фільтр для значення n2610
.
Другий параметр також може бути використаний для визначення типу фільтрації, який потрібно зробити. Тут дещо ускладнюється і варто заглиблюватися трохи більше.
Тож за замовчуванням наступне
$collection_of_products->addFieldToFilter('sku','n2610');
є (по суті) еквівалентним
WHERE sku = "n2610"
Погляньте на себе. Виконання наступного
public function testAction()
{
var_dump(
(string)
Mage::getModel('catalog/product')
->getCollection()
->addFieldToFilter('sku','n2610')
->getSelect());
}
дасть урожай
SELECT `e`.* FROM `catalog_product_entity` AS `e` WHERE (e.sku = 'n2610')'
Майте на увазі, що це може швидко ускладнитися, якщо ви використовуєте атрибут EAV. Додати атрибут
var_dump(
(string)
Mage::getModel('catalog/product')
->getCollection()
->addAttributeToSelect('*')
->addFieldToFilter('meta_title','my title')
->getSelect()
);
і запит надходить із загальним рівнем.
SELECT `e`.*, IF(_table_meta_title.value_id>0, _table_meta_title.value, _table_meta_title_default.value) AS `meta_title`
FROM `catalog_product_entity` AS `e`
INNER JOIN `catalog_product_entity_varchar` AS `_table_meta_title_default`
ON (_table_meta_title_default.entity_id = e.entity_id) AND (_table_meta_title_default.attribute_id='103')
AND _table_meta_title_default.store_id=0
LEFT JOIN `catalog_product_entity_varchar` AS `_table_meta_title`
ON (_table_meta_title.entity_id = e.entity_id) AND (_table_meta_title.attribute_id='103')
AND (_table_meta_title.store_id='1')
WHERE (IF(_table_meta_title.value_id>0, _table_meta_title.value, _table_meta_title_default.value) = 'my title')
Не заважайте суті, але намагайтеся не думати надто багато про SQL, якщо у вас є термін.
Інші оператори порівняння Я впевнений, що вам цікаво «а що, якщо я хочу щось інше, ніж рівне за запитом»? Не дорівнює, більший, менший і т. Д. Другий параметр методу addFieldToFilter також охопив вас там. Він підтримує альтернативний синтаксис, де замість передачі рядка ви передаєте один елемент масиву.
Ключ цього масиву - тип порівняння, який ви хочете зробити. Значення, пов’язане з цим ключем, - це значення, за яким ви хочете відфільтрувати. Давайте повторимо вищевказаний фільтр, але з цим явним синтаксисом
public function testAction()
{
var_dump(
(string)
Mage::getModel('catalog/product')
->getCollection()
->addFieldToFilter('sku',array('eq'=>'n2610'))
->getSelect()
);
}
Виклик нашого фільтра
addFieldToFilter('sku',array('eq'=>'n2610'))
Як бачите, другий параметр - це масив PHP. Його ключовим елементом є еквівалент, який означає рівність. Значення цього ключа n2610, це значення, за яким ми фільтруємо.
У Magento є така кількість англійської мови, як фільтри, які принесуть сльозу пам’яті (і, можливо, біль) будь-яким старим розробникам Perl в аудиторії.
Нижче перераховані всі фільтри разом із прикладом їх еквівалентів SQL.
array("eq"=>'n2610')
WHERE (e.sku = 'n2610')
array("neq"=>'n2610')
WHERE (e.sku != 'n2610')
array("like"=>'n2610')
WHERE (e.sku like 'n2610')
array("nlike"=>'n2610')
WHERE (e.sku not like 'n2610')
array("is"=>'n2610')
WHERE (e.sku is 'n2610')
array("in"=>array('n2610'))
WHERE (e.sku in ('n2610'))
array("nin"=>array('n2610'))
WHERE (e.sku not in ('n2610'))
array("notnull"=>'n2610')
WHERE (e.sku is NOT NULL)
array("null"=>'n2610')
WHERE (e.sku is NULL)
array("gt"=>'n2610')
WHERE (e.sku > 'n2610')
array("lt"=>'n2610')
WHERE (e.sku < 'n2610')
array("gteq"=>'n2610')
WHERE (e.sku >= 'n2610')
array("moreq"=>'n2610') //a weird, second way to do greater than equal
WHERE (e.sku >= 'n2610')
array("lteq"=>'n2610')
WHERE (e.sku <= 'n2610')
array("finset"=>array('n2610'))
WHERE (find_in_set('n2610',e.sku))
array('from'=>'10','to'=>'20')
WHERE e.sku >= '10' and e.sku <= '20'
Більшість із них пояснюють себе, але деякі заслуговують на спеціальне опитування
in, nin, find_in_set Умови та умови nin дозволяють передавати масив значень. Тобто, частина значень вашого фільтруючого масиву сама може бути масивом.
array("in"=>array('n2610','ABC123')
WHERE (e.sku in ('n2610','ABC123'))
notnull, null Ключове слово NULL є особливим у більшості ароматів SQL. Зазвичай це не буде добре грати зі стандартним оператором рівності (=). Якщо вказати notnull або null як тип вашого фільтра, ви отримаєте правильний синтаксис для порівняння NULL, ігноруючи незалежне значення
array("notnull"=>'n2610')
WHERE (e.sku is NOT NULL)
from - to filter Це ще один спеціальний формат, який порушує стандартне правило. Замість масиву одного елемента ви задаєте масив з двома елементами. Один елемент має ключ від, інший елемент - ключ від. Як вказано в клавішах, цей фільтр дозволяє створити діапазон / в діапазон, не турбуючись про більше, ніж символи
public function testAction
{
var_dump(
(string)
Mage::getModel('catalog/product')
->getCollection()
->addFieldToFilter('price',array('from'=>'10','to'=>'20'))
->getSelect()
);
}
Вищевказані врожаї
WHERE (_table_price.value >= '10' and _table_price.value <= '20')'
ІЛИ АБО, або це АБО та І? Нарешті, ми підходимо до булевих операторів. Це рідкісний момент, коли ми фільтруємо лише один атрибут. На щастя, колекції Magento охопили нас. Ви можете з'єднати декілька викликів до addFieldToFilter, щоб отримати ряд запитів "І".
function testAction()
{
echo(
(string)
Mage::getModel('catalog/product')
->getCollection()
->addFieldToFilter('sku',array('like'=>'a%'))
->addFieldToFilter('sku',array('like'=>'b%'))
->getSelect()
);
}
Об’єднавши декілька викликів, як описано вище, ми створимо пункт де, який виглядає приблизно так
WHERE (e.sku like 'a%') AND (e.sku like 'b%')
Тим із вас, хто щойно підняв руку, так, наведений вище приклад завжди повертає 0 записів. Жодна ску не може починатися з БОТИ a та a b. Що ми, мабуть, хочемо тут - це АБО запит. Це приводить нас до іншого заплутаного аспекту другого параметра addFieldToFilter.
Якщо ви хочете створити запит АБО, вам потрібно передати масив фільтрів масивів як другий параметр. Я вважаю, що найкраще призначити ваші індивідуальні масиви фільтрів змінним
public function testAction()
{
$filter_a = array('like'=>'a%');
$filter_b = array('like'=>'b%');
}
а потім призначити масив усіх моїх змінних фільтрів
public function testAction()
{
$filter_a = array('like'=>'a%');
$filter_b = array('like'=>'b%');
echo(
(string)
Mage::getModel('catalog/product')
->getCollection()
->addFieldToFilter('sku',array($filter_a,$filter_b))
->getSelect()
);
}
На відміну від явного, ось згаданий вище масив фільтруючих масивів.
array($filter_a,$filter_b)
Це дає нам пункт WHERE, який виглядає приблизно так
WHERE (((e.sku like 'a%') or (e.sku like 'b%')))
- Varien_Data_Collection :: addFilter
addFilter($field, $value, $type = 'and')
addFilter()
дозволяє лише фільтрувати одне поле за одним значенням і типом. $type
може бути будь-який із:
- "і" (за замовчуванням) - додає AND $ поле = $ значення до пункту WHERE
- "або" - додає "АБО $ поле = значення $ до пункту WHERE
Детальніше
addFilter
зattributes
?