magento
Come filtrare le raccolte
Ricerca…
Parametri
Parametro | Dettagli |
---|---|
$ addFieldToFilter ( $ campo , $ condizione = null) | {string} Il campo che stiamo aggiungendo al filtro. |
$ addFieldToFilter ($ campo, $ condizione = null ) | {misto} La definizione del filtro che useremo. |
addAttributeToFilter ( $ attr , $ condizione = null, $ join = 'inner') | {string} Il campo che stiamo aggiungendo al filtro. |
addAttributeToFilter ($ attr, $ condizione = null , $ join = 'inner') | {misto} La definizione del filtro che useremo. |
addAttributeToFilter ($ attr, $ condizione = null, $ join = 'inner' ) | {('inner', 'left')} Il tipo di join SQL da utilizzare quando si entra nella tabella EAV. |
Osservazioni
Argomenti di confronto dei filtri
Magento offre anche un modo flessibile di filtraggio utilizzando anche operatori di confronto. Ecco una lista di operatori validi e la loro sintassi:
Tutti gli argomenti di confronto possono essere passati al secondo parametro dei addFieldToFielter()
o addAttributeToFilter()
.
$collection_of_products->addAttributeToFilter('visible',array("eq"=>1));
Confronto | Array di argomenti | Snippet SQL risultante |
---|---|---|
È uguale a | array ( "eq" => $ var) | DOVE (`my_field` = $ var) |
Non uguale | array ( "neq" => $ var) | DOVE (`my_field`! = $ Var) |
Piace | array ( "come" => $ var) | DOVE (`my_field` LIKE $ var) |
Non come | array ( "Nlike" => $ var) | DOVE (`my_field` NOT LIKE $ var) |
È | array ( "è" => $ var) | DOVE (`my_field` IS $ var) |
Nel | array ( "a" => $ var) | DOVE (`my_field` IN ($ var)) |
Non in | array ( "nin" => $ var) | DOVE (`my_field` NOT IN ($ var)) |
Nullo | array ( "nullo" => true) | DOVE (`my_field` È NULL) |
Non nullo | array ( "notnull" => true) | DOVE (`my_field` NON È NULL) |
Più grande di | array ( "GT" => $ var) | DOVE (`my_field`> $ var) |
Meno di | array ( "LT" => $ var) | DOVE (`my_field` <$ var) |
Maggiore o uguale | array ( "gteq" => $ var) | DOVE (`my_field`> = $ var) |
Meno o uguale | array ( "lteq" => $ var) | DOVE (`my_field` <= $ var) |
Trova nel set | array ( "finset" => array ($ var)) | DOVE (find_in_set ($ var, `mio_field`) |
Da e a | array ("from" => $ var1, "a" => $ var2) | DOVE (`my_field`> = $ var1 AND` my_field` <= $ var2) |
Collezioni di filtri
Magento ha un potente set di metodi per filtrare le collezioni. Dato che ci sono due tipi di oggetti che possono essere contenuti nelle collezioni, dobbiamo prima determinare quale tipo di dati stiamo lavorando prima di poterlo filtrare. Magento implementa un modello di dati EAV per entità come prodotti e categorie. C'è un diverso insieme di metodi da usare se stiamo filtrando una collezione di oggetti EAV.
In Magento, gli ordini non sono memorizzati come oggetti EAV. Ciò rende la raccolta ordini un buon esempio per il filtraggio di una raccolta di base.
$collection_of_orders = Mage::getModel('sales/order')->getCollection();
$collection_of_orders->addFieldToFilter('status','processing');
Se osserviamo la collezione di prodotti, possiamo vedere che i prodotti sono memorizzati in un modello di dati EAV. Possiamo facilmente filtrare anche per attributi EAV.
$collection_of_products = Mage::getModel('catalog/product')->getCollection();
$collection_of_products->addAttributeToFilter('visible',1);
Gestione di AND e OR nei filtri
Quando interrogiamo i nostri dati, spesso abbiamo bisogno di più di un filtro per ottenere il set di dati esatto che stiamo cercando. In SQL, gestiamo questo con le clausole AND e OR. Possiamo ottenere la stessa cosa con le collezioni.
Per aggiungere una clausola AND alla query, è sufficiente aggiungere un'altra chiamata al metodo. Questo aggiungerà il secondo filtro all'istruzione WHERE originale che lo unisce ad un AND.
Mage::getModel('catalog/product')->getCollection()
->addFieldToFilter('sku',array('like'=>'a%'))
->addFieldToFilter('sku',array('like'=>'%b'));
La clausola WHERE risultante sarà simile a questa:
WHERE (e.sku like 'a%') AND (e.sku like '%b')
Ora diciamo che vogliamo tutti gli skus che iniziano con 'a' O terminano con 'b'. Come aggiungiamo una clausola OR? Grazie alle collezioni di Magento, è abbastanza semplice. Aggiungiamo il filtro come un secondo elemento nell'array del filtro.
Mage::getModel('catalog/product')->getCollection()
->addFieldToFilter('sku', array(
array('like'=>'a%'),
array('like'=>'%b')
));
Ora, la clausola WHERE risultante sarà simile a questa:
WHERE (((e.sku like 'a%') or (e.sku like '%b')))