La ragione per cui la risposta di ColinM funziona è grazie al codice a app/code/core/Mage/Catalog/Model/Resource/Product/Collection.php
's addAttributeToFilter
metodo. Se si utilizza questo formato di array, non chiama addAttributeToSelect
. In modalità flat, addAttributeToSelect
non riesce in modo silenzioso se l'attributo non si trova nella tabella flat.
(di seguito è riportato un hash della mia risposta su /programming/6271284/can-i-add-other-attributes-to-magentos-flat-product-catalog-table/17021620 - Sono non sono sicuro di cosa sia l'etichetta per quello, ma so che l'avrei trovato utile)
Volevo una soluzione "pulita" per la selezione e il filtraggio di raccolte in modalità flat su attributi non piatti, che:
- non richiede che l'attributo abbia impostazioni specifiche nell'amministratore (potrebbe essere aggiunto da un utente o nascosto nel front-end)
- funziona sia in modalità flat che non flat
Ho usato la raccolta di prodotti associata, ma questo vale per qualsiasi raccolta EAV.
Codice in errore:
$_product = Mage::getModel('catalog/product')->loadByAttribute( 'sku', 'ABC123' );
$coll = $_product->getTypeInstance()->getAssociatedProductCollection()
->addAttributeToSelect( 'my_custom_attribute' )
->addAttributeToFilter( 'my_custom_attribute', 3 )
;
In modalità flat, il codice sopra riportato non riesce a selezionare o filtrare silenziosamente l'attributo se non si trova nella tabella flat.
Aggiungendo alla selezione:
$_product = Mage::getModel('catalog/product')->loadByAttribute( 'sku', 'ABC123' );
$coll = $_product->getTypeInstance()->getAssociatedProductCollection()
->joinAttribute( 'my_custom_attribute', 'catalog_product/my_custom_attribute', 'entity_id', null, 'left' )
->addAttributeToSelect( 'my_custom_attribute' )
;
Il joinAttribute
metodo aggiunge un join alla query per l'attributo specifico richiesto. Funziona ancora quando l'attributo è già nella tabella piatta, ma sarà leggermente meno efficiente rispetto all'utilizzo puramente della tabella piatta.
Ho usato un left
join lì, per assicurarmi che recuperi prodotti se my_custom_attribute
non è impostato su tali prodotti. Cambialo per inner
se sei interessato solo alle righe in cui my_custom_attribute
è impostato.
Aggiunta al filtro (secondo ColinM sopra):
$_product = Mage::getModel('catalog/product')->loadByAttribute( 'sku', 'ABC123' );
$coll = $_product->getTypeInstance()->getAssociatedProductCollection()
->addAttributeToFilter( array( array( 'attribute' => 'my_custom_attribute', 'eq' => 3 ) ) )
;
Il codice sopra lo aggiungerà alla selezione e obbedirà al tuo filtro.
(testato in CE 1.6.2.0)
non-flat attribute
? Grazie. E non fare magento Confusione. È già confuso