magento
Jak filtrować kolekcje
Szukaj…
Parametry
Parametr | Detale |
---|---|
$ addFieldToFilter ( $ field , $ condition = null) | {string} Pole, które dodajemy do filtra. |
$ addFieldToFilter ($ field, $ condition = null ) | {mixed} Definicja filtra, którego będziemy używać. |
addAttributeToFilter ( $ attr , $ condition = null, $ join = 'inner') | {string} Pole, które dodajemy do filtra. |
addAttributeToFilter ($ attr, $ condition = null , $ join = 'inner') | {mixed} Definicja filtra, którego będziemy używać. |
addAttributeToFilter ($ attr, $ condition = null, $ join = 'inner' ) | {(„wewnętrzny”, „lewy”)} Typ łączyć sql używany podczas dołączania do tabeli EAV. |
Uwagi
Filtruj argumenty porównania
Magento oferuje również elastyczny sposób filtrowania przy użyciu operatorów porównania. Oto lista poprawnych operatorów i ich składni:
Wszystkie argumenty porównawcze można przekazać do drugiego parametru metod addFieldToFielter()
lub addAttributeToFilter()
.
$collection_of_products->addAttributeToFilter('visible',array("eq"=>1));
Porównanie | Tablica argumentów | Wynikowy fragment kodu SQL |
---|---|---|
Równa się | tablica („eq” => $ var) | GDZIE (`my_field` = $ var) |
Nie równe | tablica („neq” => $ var) | GDZIE (`my_field`! = $ Var) |
Lubić | tablica („jak” => $ var) | GDZIE (`my_field` LIKE $ var) |
Nie jak | tablica („nlike” => $ var) | GDZIE (`my_field` NIE LUBI $ var) |
Jest | tablica („is” => $ var) | GDZIE (`my_field` IS $ var) |
W | tablica („w” => $ var) | GDZIE (`my_field` IN ($ var)) |
Nie w | tablica („nin” => $ var) | GDZIE (`my_field` NOT IN ($ var)) |
Zero | tablica („null” => true) | GDZIE („moje_pole” JEST NULL) |
Nie jest zerem | tablica („notnull” => true) | GDZIE („moje_pole” NIE JEST NULL) |
Lepszy niż | array ("gt" => $ var) | GDZIE (`my_field`> $ var) |
Mniej niż | tablica („lt” => $ var) | GDZIE (`my_field` <$ var) |
Większy bądź równy | tablica („gteq” => $ var) | GDZIE (`my_field`> = $ var) |
Mniej niż lub równy | tablica („lteq” => $ var) | GDZIE (`my_field` <= $ var) |
Znajdź w zestawie | array ("finset" => array ($ var)) | GDZIE (find_in_set ($ var, `my_field`) |
Od i do | tablica („od” => $ var1, „do” => $ var2) | GDZIE (`my_field`> = $ var1 ORAZ` my_field` <= $ var2) |
Filtrowanie kolekcji
Magento ma potężny zestaw metod do filtrowania kolekcji. Ponieważ istnieją dwa typy obiektów, które mogą być zawarte w kolekcjach, musimy najpierw ustalić, z jakim typem danych pracujemy, zanim będziemy mogli je filtrować. Magento wdraża model danych EAV dla podmiotów, takich jak produkty i kategorie. Istnieje inny zestaw metod, których należy użyć, jeśli filtrujemy kolekcję obiektów EAV.
W Magento Zamówienia nie są przechowywane jako Obiekty EAV. To sprawia, że kolekcja zamówień jest dobrym przykładem filtrowania kolekcji podstawowej.
$collection_of_orders = Mage::getModel('sales/order')->getCollection();
$collection_of_orders->addFieldToFilter('status','processing');
Jeśli spojrzymy na kolekcję produktów, zobaczymy, że są one przechowywane w modelu danych EAV. Możemy również łatwo filtrować według atrybutów EAV.
$collection_of_products = Mage::getModel('catalog/product')->getCollection();
$collection_of_products->addAttributeToFilter('visible',1);
Obsługa AND i OR w filtrach
Kiedy przeszukujemy nasze dane, często potrzebujemy więcej niż jednego filtra, aby uzyskać dokładnie taki zestaw danych, którego szukamy. W SQL obsługujemy to za pomocą klauzul AND i OR. To samo możemy osiągnąć dzięki kolekcjom.
Aby dodać do zapytania klauzulę AND, wystarczy dodać kolejne wywołanie metody. To doda drugi filtr do oryginalnej instrukcji WHERE, łącząc ją z AND.
Mage::getModel('catalog/product')->getCollection()
->addFieldToFilter('sku',array('like'=>'a%'))
->addFieldToFilter('sku',array('like'=>'%b'));
Wynikowa klauzula WHERE będzie wyglądać następująco:
WHERE (e.sku like 'a%') AND (e.sku like '%b')
Powiedzmy teraz, że chcemy wszystkich skusów, które zaczynają się na „a” LUB kończą na „b”. Jak dodać klauzulę OR? Dzięki kolekcjom Magento jest to całkiem proste. Dodajemy filtr jako drugi element w tablicy filtrów.
Mage::getModel('catalog/product')->getCollection()
->addFieldToFilter('sku', array(
array('like'=>'a%'),
array('like'=>'%b')
));
Teraz wynikowa klauzula WHERE będzie wyglądać następująco:
WHERE (((e.sku like 'a%') or (e.sku like '%b')))