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

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a magento.stackexchange
scroll top