2009-11-20 5 views
10

Lors de l'utilisation de la méthode de collecte Magento, addFieldToFilter est-il possible d'autoriser le filtrage par valeurs NULL? Je veux sélectionner tous les produits d'une collection qui ont un attribut personnalisé même si aucune valeur n'est affectée à l'attribut.Magento addFieldToFilter autorise les valeurs NULL

Répondre

1

Vous n'avez pas besoin d'utiliser addFieldToFilter.

maintenant la solution:
attributs nom est connu sous le nom code dans magento, il vous suffit d'utiliser le code ci-dessous pour obtenir tous les produits qui ont un attribut spécifique comme un tableau

 

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

vous pouvez également spécifier certaines conditions pour la valeur de l'attribut dans addAttributeToFilter dans le deuxième paramètre de addAttributeToFilter.

vous pouvez trouver cette méthode dans ce fichier (pour étude ultérieure):

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

Merci de remarquer addFieldToFilter - elle a conduit à la solution de gestion NULL FIE lds – leepowers

+0

c'est en fait faux, cela fera une comparaison avec un '' vide '' plutôt qu'un filtrage "nul". – useless

18

Filtrage d'une collection de produits par null/attributs vides a deux solutions possibles. Magento utilise un INNER JOIN pour saisir les valeurs des attributs à filtrer. MAIS si une valeur n'est pas affectée à l'attribut product, la jointure échouera, car une table/relation de base de données est manquante.

Solution # 1: Utilisation addAttributeToFilter() et changer le type de jointure de "intérieur" (par défaut) à "gauche":

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

Solution # 2: Assurez-vous que votre attribut personnalisé a une valeur par défaut. Magento est conservateur à cet égard. Magento créera seulement la relation entre un attribut et un produit si une valeur est donnée pour l'attribut. Ainsi, en l'absence d'une valeur spécifiée par l'utilisateur ou d'une valeur par défaut, l'attribut ne sera pas accessible pour filtrer un produit même si l'attribut apparaît dans la vue détaillée du produit sous le panneau d'administration.

+3

stratégie de jointure gauche a bien fonctionné. On dirait que cette réponse est assez ancienne, mais je dois dire merci quand même! – shaune

+1

La jointure à gauche est un must pour saisir l'attribut, IMO. – Nick

49

Je vois que vous avez déjà trouvé une solution, mais il y a aussi cette option:

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

Mais si vous voulez utiliser "NULL" => false, qui NE FONCTIONNE PAS. (et je remarque que vous pouvez utiliser des éléments tels que « dans », « nin », « éq », « NEQ », « gt »), vous pouvez le faire:

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

Espérons que cela est toujours utile. ..

+4

Voir la documentation dans le code de Varien_Data_Collection_Db :: _ getConditionSql(). Il décrit toutes les options possibles, comme le 'null' mentionné, mais aussi 'notnull' pour le reverse. – fietserwin

20

Cela fonctionne pour ne pas les filtres NULL

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

Parce que la question ne correspond pas exactement au titre de la question et je l'ai trouvé le leur plusieurs fois en recherchant une condition comme: Offre spéciale OU NULL

Si vous souhaitez filtrer une collection correspondant à une valeur ou NULL, vous pouvez utiliser:

$collection->addFieldToFilter('<attribute>', array(
    array('eq' => '<value>'), 
    array('null' => true) 
)); 
Questions connexes