La raison pour laquelle la réponse de ColinM fonctionne est due au code dans app/code/core/Mage/Catalog/Model/Resource/Product/Collection.phpla addAttributeToFilterméthode de. Si vous utilisez ce format de tableau, il n'appelle pas addAttributeToSelect. En mode plat, addAttributeToSelectéchoue silencieusement si l'attribut n'est pas dans la table plate.
(ci-dessous est un nouveau hachage de ma réponse sur /programming/6271284/can-i-add-other-attributes-to-magentos-flat-product-catalog-table/17021620 - je suis Je ne sais pas quelle est l'étiquette pour cela, mais sachez que j'aurais trouvé cela utile)
Je voulais une solution "propre" pour la sélection et le filtrage de collection en mode plat sur des attributs non plats, qui:
- ne nécessite pas que l'attribut ait des paramètres spécifiques dans admin (il peut être ajouté par un utilisateur ou masqué sur le front-end)
- fonctionne aussi bien en mode plat qu'en mode non plat
J'ai utilisé la collection de produits associée, mais cela s'applique à toute collection EAV.
Code défaillant:
$_product = Mage::getModel('catalog/product')->loadByAttribute( 'sku', 'ABC123' );
$coll = $_product->getTypeInstance()->getAssociatedProductCollection()
->addAttributeToSelect( 'my_custom_attribute' )
->addAttributeToFilter( 'my_custom_attribute', 3 )
;
En mode plat, le code ci-dessus ne parvient pas à sélectionner ou filtrer silencieusement l'attribut s'il ne se trouve pas dans la table plate.
Ajout à la sélection:
$_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' )
;
le joinAttribute méthode ajoute une jointure à la requête pour l'attribut spécifique demandé. Cela fonctionne toujours lorsque l'attribut est déjà dans la table plate, mais sera légèrement moins efficace que l'utilisation pure de la table plate.
J'ai utilisé une leftjointure là-bas, pour m'assurer qu'elle récupère les produits si elle my_custom_attributen'est pas définie sur ces produits. Modifiez cela innersi vous n'êtes intéressé que par les lignes où my_custom_attributeest défini.
Ajout au filtre (selon ColinM ci-dessus):
$_product = Mage::getModel('catalog/product')->loadByAttribute( 'sku', 'ABC123' );
$coll = $_product->getTypeInstance()->getAssociatedProductCollection()
->addAttributeToFilter( array( array( 'attribute' => 'my_custom_attribute', 'eq' => 3 ) ) )
;
Le code ci-dessus l'ajoutera à la sélection et obéira à votre filtre.
(testé dans CE 1.6.2.0)
non-flat attribute? Merci .et ne pas rendre magento déroutant. C'est déjà déroutant