Eu estou fazendo o seguinte:
$productCollection = Mage::getModel('catalog/product')
->getCollection();
$productCollection
->addAttributeToFilter('my_attribute', 1);
my_attribute
não está nas tabelas planas, mas as tabelas planas estão ativadas.
Eu continuo recebendo a coleção completa.
O motivo parece estar em \Mage_Catalog_Model_Resource_Product_Collection::addAttributeToSelect
:
$columns = $this->getEntity()->getAttributeForSelect($attributeCode);
No $this->getEntity()
é uma instância da Mage_Catalog_Model_Resource_Product_Flat
qual busca os campos simples - e se nenhum for encontrado, apenas retorna nulo.
O que é uma maneira limpa de adicionar um atributo não plano ao filtro de coleção?
No meu caso, não faz sentido adicionar o atributo à tabela plana.
ce-1.7.0.2
collection
Alex
fonte
fonte
non-flat attribute
? Graças .e não fazem magento Confundindo .Ele já está confundindoRespostas:
Você pode se juntar à mesa necessária.
Você também pode querer participar por store_id.
fonte
Um hack (CE 1.6.2.0+) deve passar a condição como uma matriz e, acredite ou não, isso funciona conforme o esperado:
fonte
addFieldToFiler
é um wrapper paraaddAttributeToFilter
e isso tem uma opção para passar o atributo como uma matriz:if (is_array($attribute)) { $sqlArr = array(); foreach ($attribute as $condition) { $sqlArr[] = $this->_getAttributeConditionSql($condition['attribute'], $condition, $joinType); } $conditionSql = '('.implode(') OR (', $sqlArr).')'; }
A razão a resposta de ColinM funciona é devido ao código em
app/code/core/Mage/Catalog/Model/Resource/Product/Collection.php
'saddAttributeToFilter
método. Se você usar esse formato de matriz, ele não chamaaddAttributeToSelect
. 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:
Usei a coleção de produtos associada, mas isso se aplica a qualquer coleção de EAV.
Código com falha:
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:
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, semy_custom_attribute
não estiver definida nesses produtos. Altere isso parainner
se você estiver interessado apenas nas linhas em quemy_custom_attribute
está definido.Adicionando ao filtro (conforme ColinM acima):
O código acima o adicionará ao select e também obedecerá ao seu filtro.
(testado na CE 1.6.2.0)
fonte
No
Mage_Rss
módulo, eles usaram o método hacky para desativar as tabelas planas. Eles usam o fato de que as tabelas simples estão sempre desativadas no repositório de administradores e, portanto, apenas emulam o repositório de administradores.Depois de iniciar a emulação, você deve redefini-la com
emulationModel->stopEnvironmentEmulation()
fonte
quando você cria o atributo, ele deve estar no nível Global e filtrável. Desta forma, será utilizável na navegação em layouts. Também exigirá que o atributo seja uma lista suspensa ou multiselecionada. Eu pessoalmente aconselho a não alterar os arquivos principais para atender às suas necessidades neste caso
fonte