Wiele warunków (LUB i AND wewnątrz AND) w addAttributeToFilter


19

Jak utworzyć warunek wielokrotny w addAttributeToFilter?

Chcę otrzymać zapytanie SQL podobne do tego (załączony obraz):

WHERE ((`e`.`news_from_date` > '2013-09-12') OR (`e`.`news_to_date` < '2013-09-12'))
AND ((((`e`.`special_price` IS NULL))) OR (((`e`.`special_price` IS NOT NULL)) AND ((`e`.`special_from_date` < '2013-09-12') OR (`e`.`special_to_date` > '2013-09-12'))))

$collection->addAttributeToFilter('special_price', array('null'=>'special_price'), 'left');

Dziękuję Ciwprowadź opis zdjęcia tutaj


Znalazłem to bardzo przydatne: blog.chapagain.com.np/…
nicolallias

Odpowiedzi:


41

Powinieneś być w stanie połączyć większość tych technik, aby utworzyć zapytanie, które chcesz. W przypadku tabel sprzedaży prawdopodobnie użyjesz addFieldToFilter- ale Zend_Db_Exprjest to prawdopodobnie ścieżka najmniejszego oporu dla Ciebie:

addAttributeToFilter:

Według Wiki Magento : Podczas tworzenia nawiasów zawierających ORwarunki możesz wykonać następujące czynności:

Jeśli tablica zostanie przekazana, ale nie określono kodu atrybutu, zostanie zinterpretowana jako grupa warunków LUB, które będą przetwarzane w ten sam sposób.

Na podstawie tego możemy skonstruować następujące elementy:

$collection->addAttributeToFilter(
    array(
        array('attribute'=> 'someattribute','like' => 'value'),
        array('attribute'=> 'otherattribute','like' => 'value'),
        array('attribute'=> 'anotherattribute','like' => 'value'),
    )
);

Spowoduje to wyświetlenie WHEREzdania o formacie:

WHERE ((someattribute LIKE 'value') OR (otherattribute LIKE 'value') OR (anotherattribute LIKE 'value'))

addFieldToFilter:

W przypadku, gdy model jest bezpośrednio połączony z tabelą DB, do zastosowania warunków warunkowych w kolumnie bazy danych według nazwy wymagane są:

$collection->addFieldToFilter(
    array('title', 'content'),
    array(
        array('like'=>'%$titlesearchtext%'), 
        array('like'=>'%$contentsearchtext%')
    )
)

Zend_Db_Expr:

W przypadku znacznie bardziej skomplikowanych konstrukcji możesz zbudować własną, używając klauzuli where Zend_Db_Expr. Na przykład :

$collection->getSelect()->where(new Zend_Db_Expr("(e.created_at > '2013-01-01 00:00:00' OR e.created_at <'2012-01-01 00:00:00)"));

Źródło :

/programming/5301231/addattributetofilter-and-or-condition-in-magentos-collection

/programming/3826474/magento-addfieldtofilter-two-fields-match-as-or-not-and/7851884#7851884


Dziękuję za odpowiedź, ale chcę, aby warunek był taki: GDZIE (CONDITION_1 LUB (CONDITION_2 AND (CONDITION_3 OR CONDITION_4))). Już zamieszczam zapytanie, które chcę powyżej.
Andhi Irawan,

1
Myślałem, że zwróciłem uwagę, że możesz użyć Zend_Db_Expr:$collection->getSelect()->where(new Zend_Db_Expr("(CONDITION_1 OR (CONDITION_2 AND (CONDITION_3 OR CONDITION_4)))"));
philwinkle,

dzięki philwinkle.base na twojej odpowiedzi, to jest przykładowe, co zrobiłem z addAttributeToFilter i AND i OR condition: pastebin.com/ZznxLAai
Andhi Irawan

Czy istnieje sposób ustalenia, który atrybut wygenerował wynik? Szukam niestandardowego modelu kolekcji w trzech dziedzinach ( name, altnernate_name, description) i chciałbyś wiedzieć, kiedy wynik jest ze względu na descriptionatrybut.
pspahn

4

Jeśli chcesz dołączyć AND wraz z kombinacją OR, to

$colemanManufacturerSku = Mage::getResourceModel('catalog/product_collection')
    ->addAttributeToSelect('sku')
    ->addAttributeToSelect('sku_1')
    ->addAttributeToSelect('sku_2')
    ->addAttributeToSelect('sku_3')
    ->addAttributeToFilter('type_id', array('eq' => 'simple'))
    // Above condition will AND with following OR
    ->addAttributeToFilter(
        array(
            array(
                'attribute' => 'sku_1',
                'neq' => ''
            ),
            array(
                'attribute' => 'sku_2',
                'neq' => ''
            ),
            array(
                'attribute' => 'sku_3',
                'neq' => ''
            )
        )
    );

2
+1 do rozwiązania, ale trzeba dokładnie odwrotnie, czyli gdzie (warunek_1 I warunek_2) OR (warunek_3 I CONDITION_4))), można proszę o pomoc
Haris

1

Lub warunek za pomocą addFieldToFilter


$collection->addFieldToFilter
                (   
                    array('email','mobile'),
                    array($emaiId,$mobNum)
                );

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.