A razão a resposta de ColinM funciona é devido ao código em app/code/core/Mage/Catalog/Model/Resource/Product/Collection.php
's addAttributeToFilter
método. Se você usar esse formato de matriz, ele não chama addAttributeToSelect
. No modo simples, addAttributeToSelect
falha silenciosamente se o atributo não estiver na tabela plana.
(abaixo está um re-hash da minha resposta em /programming/6271284/can-i-add-other-attributes-to-magentos-flat-product-catalog-table/17021620 - Estou não sei ao certo qual é a etiqueta para isso, mas sei que a consideraria útil)
Eu queria uma solução "limpa" para a coleção de modo plano, selecionando e filtrando atributos não planos, que:
- não requer que o atributo tenha configurações específicas no administrador (ele pode ser adicionado por um usuário ou oculto no front-end)
- funciona para o modo plano e não plano
Usei a coleção de produtos associada, mas isso se aplica a qualquer coleção de EAV.
Código com falha:
$_product = Mage::getModel('catalog/product')->loadByAttribute( 'sku', 'ABC123' );
$coll = $_product->getTypeInstance()->getAssociatedProductCollection()
->addAttributeToSelect( 'my_custom_attribute' )
->addAttributeToFilter( 'my_custom_attribute', 3 )
;
No modo simples, o código acima silenciosamente falha ao selecionar ou filtrar o atributo, se não estiver na tabela plana.
Adicionando ao select:
$_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' )
;
O joinAttribute
método adiciona uma junção à consulta para o atributo específico solicitado. Ele ainda funciona quando o atributo já está na mesa plana, mas será um pouco menos eficiente do que puramente usando a mesa plana.
Eu usei uma left
associação lá, para garantir que ela busque produtos, se my_custom_attribute
não estiver definida nesses produtos. Altere isso para inner
se você estiver interessado apenas nas linhas em que my_custom_attribute
está definido.
Adicionando ao filtro (conforme ColinM acima):
$_product = Mage::getModel('catalog/product')->loadByAttribute( 'sku', 'ABC123' );
$coll = $_product->getTypeInstance()->getAssociatedProductCollection()
->addAttributeToFilter( array( array( 'attribute' => 'my_custom_attribute', 'eq' => 3 ) ) )
;
O código acima o adicionará ao select e também obedecerá ao seu filtro.
(testado na CE 1.6.2.0)
non-flat attribute
? Graças .e não fazem magento Confundindo .Ele já está confundindo