La raison pour laquelle la réponse de ColinM fonctionne est due au code dans app/code/core/Mage/Catalog/Model/Resource/Product/Collection.php
la addAttributeToFilter
mé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 left
jointure là-bas, pour m'assurer qu'elle récupère les produits si elle my_custom_attribute
n'est pas définie sur ces produits. Modifiez cela inner
si vous n'êtes intéressé que par les lignes où my_custom_attribute
est 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