2009-11-20 11 views
10

Podczas korzystania z metody kolekcji Magento, addFieldToFilter umożliwia filtrowanie według wartości NULL? Chcę wybrać wszystkie produkty w kolekcji, które mają atrybut niestandardowy, nawet jeśli do atrybutu nie została przypisana żadna wartość.Magento addFieldToFilter allow NULLs

Odpowiedz

1

Nie trzeba używać addFieldToFilter.

teraz rozwiązanie:
atrybutów nazwa jest znana jako code w Magento, wystarczy skorzystać z poniższego kodu, aby uzyskać wszystkie produkty, które mają konkretny atrybut w postaci tablicy

 

$prodsArray=Mage::getModel('catalog/product')->getCollection() 
            ->addAttributeToFilter('custom_attribute_code') 
            ->getItems(); 
 

można również określić pewne warunki dla wartości atrybutu w addAttributeToFilter w drugim parametrze addAttributeToFilter.

można znaleźć tę metodę w tym pliku (dalsze badania):

app/code/core/Mage/Eav/Model/Entity/Collection/Abstract.php 
+0

Dzięki za wskazanie addFieldToFilter - doprowadziło to do rozwiązania obsługi NULL FIE lds – leepowers

+0

to jest rzeczywiście błędne, to zrobi porównanie z pustym filtrem "" zamiast "jest zerowym". – useless

18

Filtrowanie kolekcji produkt przez/null pustych atrybutów ma dwa możliwe rozwiązania. Magento używa INNER JOIN, aby pobrać wartości atrybutów do filtrowania. ALE jeśli atrybut produktu nie ma przypisanej wartości, połączenie nie powiedzie się, ponieważ brakuje tabeli/relacji bazy danych.

Rozwiązanie nr 1: Zastosowanie addAttributeToFilter() i zmienić typ przyłączenia od "wewnętrznego" (domyślnie) na "lewo":

$collection = Mage::getModel('catalog/product')->getCollection(); 
$collection->addAttributeToFilter('custom_attribute', array(... condition options ..), 'left'); 

Rozwiązanie nr 2: Upewnij się, że atrybut niestandardowy ma wartość domyślną. Magento jest konserwatywne pod tym względem. Magento utworzy relację między atrybutem a produktem tylko wtedy, gdy podana zostanie wartość atrybutu. Tak więc w przypadku braku wartości określonej przez użytkownika lub wartości domyślnej atrybut nie będzie dostępny do filtrowania produktu , nawet jeśli atrybut pojawi się w widoku szczegółów produktu w panelu administracyjnym.

+3

strategia łączenia lewy działała świetnie. Wygląda na to, że ta odpowiedź jest dość stara, ale i tak muszę podziękować! – shaune

+1

Lewe sprzężenie jest koniecznością przy chwytaniu atrybutu, IMO. – Nick

49

Widzę, że już znalazł rozwiązanie, ale istnieje również opcja:

$collection->addFieldToFilter('parent_item_id', array('null' => true)); 

Ale jeśli chcesz korzystać z „null” => false, co nie działa. (i zauważyłem, można użyć elementów takich jak "w", "NIN", "korektor", "NEQ", "gt"), można to zrobić:

$collection->addFieldToFilter('parent_item_id', array('neq' => 'NULL')); 

nadzieję, że to nadal pomocne. ..

+4

Zobacz dokumentację w kodzie Varien_Data_Collection_Db :: _ getConditionSql(). Opisuje wszystkie możliwe opcje, takie jak wspomniana "null", ale także "notnull" na odwrót. – fietserwin

20

Działa to na NULL filtrów

$collection->addFieldToFilter('parent_item_id', array('notnull' => true)); 
1

Ponieważ pytanie nie pasuje dokładnie tytuł pytanie i znalazłem je wielokrotnie wyszukując STAN: szczególną wartość lub NULL

Jeśli chcesz filtrować kolekcji dopasowanie wartości lub null, wówczas można użyć:

$collection->addFieldToFilter('<attribute>', array(
    array('eq' => '<value>'), 
    array('null' => true) 
)); 
Powiązane problemy