consulta addFieldToFilter() 'OR' em dados não EAV fazendo algo estranho
-
13-12-2019 - |
Pergunta
Estou modificando os resultados da pesquisa Magento para incluir categorias, páginas e postagens de blog correspondentes (da versão gratuita do Neotheme nBlog).Embora as categorias e páginas estejam funcionando bem, há algo muito estranho acontecendo com as postagens do blog.As postagens parecem estar armazenadas em uma tabela plana e não EAV.
Quando faço isso, procurando por "teste":
$needleSearch = "test";
$posts = Mage::getModel("neotheme_blog/post")
->setStoreId($storeId)
->getCollection()
->addStoreFilter()
->addStatusFilter(NeoTheme_Blog_Model_Post::STATUS_ACTIVE)
->addPublishFilter()
->addFieldToFilter(
array(
array("attribute"=>"title","like"=>$needleSearch),
array("attribute"=>"author","like"=>$needleSearch),
array("attribute"=>"summary","like"=>$needleSearch)
)
) //OR BIT
;
A consulta SELECT resultante termina com isto no meio:
((`title`.`%test%` = '') OR (`author`.`%test%` = '') OR (`summary`.`%test%` = ''))
A matriz aninhada para OR funciona bem para o EAV (categorias e páginas).
Isso também produz o mesmo resultado:
->addFieldToFilter(
array(
array("title","like"=>$needleSearch),
array("author","like"=>$needleSearch),
array("summary","like"=>$needleSearch)
)
)
Colocar array() em torno do bit semelhante termina com a consulta SQL mostrando
...(`title`.`array` = '') OR...
Um único LIKE funciona:
$posts = Mage::getModel("neotheme_blog/post")
->setStoreId($storeId)
->getCollection()
->addStoreFilter()
->addFieldToFilter( 'title', array('like'=>$needleSearch) )
;
Gostaria de saber se alguém tem alguma ideia do que pode estar acontecendo?Não consigo encontrar uma substituição de addFieldToFilter() no módulo.
Obrigado
Solução
A sintaxe correta para combinar condições de campos diferentes com OU é:
->addFieldToFilter(
array(
'title',
'author',
'summary'
),
array(
array('like' => $needleSearch),
array('like' => $needleSearch),
array('like' => $needleSearch),
)
);
ou sejapara passar uma matriz de campos e uma matriz de condições.Os elementos desses arrays com as mesmas chaves serão tratados como se tivessem sido passados como parâmetros únicos.
Outras dicas
Você já tentou algo assim?
$collection
->getSelect()
->where("(something like 'abc') OR (something_else LIKE 'doremi')");
PS:você deve se preocupar com injeção de SQL