magento
Comment filtrer les collections
Recherche…
Paramètres
Paramètre | Détails |
---|---|
$ addFieldToFilter ( $ field , $ condition = null) | {string} Le champ que nous ajoutons au filtre. |
$ addFieldToFilter ($ field, $ condition = null ) | {mixed} La définition du filtre que nous allons utiliser. |
addAttributeToFilter ( $ attr , $ condition = null, $ join = 'inner') | {string} Le champ que nous ajoutons au filtre. |
addAttributeToFilter ($ attr, $ condition = null , $ join = 'inner') | {mixed} La définition du filtre que nous allons utiliser. |
addAttributeToFilter ($ attr, $ condition = null, $ join = 'inner' ) | {('inner', 'left')} Le type de jointure SQL à utiliser pour rejoindre la table EAV. |
Remarques
Arguments de comparaison des filtres
Magento offre également un moyen flexible de filtrage en utilisant également des opérateurs de comparaison. Voici une liste des opérateurs valides et leur syntaxe:
Tous les arguments de comparaison peuvent être transmis au second paramètre des addFieldToFielter()
ou addAttributeToFilter()
.
$collection_of_products->addAttributeToFilter('visible',array("eq"=>1));
Comparaison | Tableau d'argument | Extrait SQL résultant |
---|---|---|
Équivaut à | array ("eq" => $ var) | WHERE (`my_field` = $ var) |
Inégal | array ("neq" => $ var) | WHERE (`my_field`! = $ Var) |
Comme | array ("like" => $ var) | WHERE (`my_field` LIKE $ var) |
Pas comme | array ("nlike" => $ var) | WHERE (`my_field` NOT LIKE $ var) |
Est | array ("is" => $ var) | WHERE (`my_field` IS $ var) |
Dans | array ("in" => $ var) | WHERE (`my_field` IN ($ var)) |
Pas dedans | array ("nin" => $ var) | WHERE (`my_field` NOT IN ($ var)) |
Nul | array ("null" => true) | WHERE (`my_field` IS NULL) |
Pas nul | array ("notnull" => true) | WHERE (`my_field` N'EST PAS NULL) |
Plus grand que | array ("gt" => $ var) | WHERE (`my_field`> $ var) |
Moins que | array ("lt" => $ var) | WHERE (`my_field` <$ var) |
Meilleur que ou égal | array ("gteq" => $ var) | WHERE (`my_field`> = $ var) |
Moins que ou égal | array ("lteq" => $ var) | WHERE (`my_field` <= $ var) |
Trouver dans l'ensemble | array ("finset" => array ($ var)) | WHERE (find_in_set ($ var, `my_field`) |
De et à | array ("from" => $ var1, "to" => $ var2) | WHERE (`my_field`> = $ var1 ET` my_field` <= $ var2) |
Collections de filtrage
Magento dispose d'un puissant ensemble de méthodes pour filtrer les collections. Comme il existe deux types d'objets pouvant être contenus dans des collections, nous devons d'abord déterminer le type de données avec lequel nous travaillons avant de pouvoir le filtrer. Magento implémente un modèle de données EAV pour des entités telles que des produits et des catégories. Il existe un ensemble différent de méthodes à utiliser si nous filtrons une collection d'objets EAV.
Dans Magento, les commandes ne sont pas stockées en tant qu'objets EAV. Cela fait de la collection de commandes un bon exemple pour filtrer une collection de base.
$collection_of_orders = Mage::getModel('sales/order')->getCollection();
$collection_of_orders->addFieldToFilter('status','processing');
Si nous examinons la collection de produits, nous pouvons voir que les produits sont stockés dans un modèle de données EAV. Nous pouvons facilement filtrer par attributs EAV.
$collection_of_products = Mage::getModel('catalog/product')->getCollection();
$collection_of_products->addAttributeToFilter('visible',1);
Gestion des AND et des OR dans les filtres
Lorsque nous interrogeons nos données, nous avons souvent besoin de plusieurs filtres pour obtenir le jeu de données exact que nous recherchons. En SQL, nous traitons cela avec les clauses AND et OR. Nous pouvons réaliser la même chose avec les collections.
Pour ajouter une clause AND à votre requête, ajoutez simplement un autre appel de méthode. Cela ajoutera le second filtre à l'instruction WHERE originale en la joignant à un ET.
Mage::getModel('catalog/product')->getCollection()
->addFieldToFilter('sku',array('like'=>'a%'))
->addFieldToFilter('sku',array('like'=>'%b'));
La clause WHERE résultante ressemblera à ceci:
WHERE (e.sku like 'a%') AND (e.sku like '%b')
Maintenant, disons que nous voulons que tous les skus qui commencent par 'a' OU se terminent par 'b'. Comment ajoutons-nous une clause OR? Grâce aux collections de Magento, c'est assez simple. Nous ajoutons le filtre comme deuxième élément du tableau de filtres.
Mage::getModel('catalog/product')->getCollection()
->addFieldToFilter('sku', array(
array('like'=>'a%'),
array('like'=>'%b')
));
Maintenant, la clause WHERE qui en résulte ressemblera à ceci:
WHERE (((e.sku like 'a%') or (e.sku like '%b')))