Pregunta

Estoy modificando los resultados de búsqueda de MAGENTO para incluir categorías, páginas y publicaciones de blogs (desde la versión gratuita de Neotheme Nblog).Si bien las categorías y las páginas están funcionando bien, hay algo muy extraño que está sucediendo con las publicaciones de blogs.Las publicaciones parecen ser almacenadas en un piso, no EAV, tabla.

Cuando hago esto, busca "prueba":

$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
                ;

La consulta seleccionada resultante termina con esto en el medio:

((`title`.`%test%` = '') OR (`author`.`%test%` = '') OR (`summary`.`%test%` = ''))

La matriz anidada para el o funciona bien para el EAV (categorías y páginas).

Esto también produce el mismo resultado:

            ->addFieldToFilter(
                    array(
                        array("title","like"=>$needleSearch),
                        array("author","like"=>$needleSearch),
                        array("summary","like"=>$needleSearch)
                    )
             )

Poner la matriz () alrededor de los extremos de bit como la consulta de SQL mostrando

...(`title`.`array` = '') OR...

Una sola me gusta funciona:

$posts = Mage::getModel("neotheme_blog/post")
                ->setStoreId($storeId)
                ->getCollection()
                ->addStoreFilter()
                ->addFieldToFilter( 'title', array('like'=>$needleSearch) )
;

Me preguntaba si alguien tenía alguna idea de lo que podría estar sucediendo?No puedo encontrar una anulación de addfieldtofilter () en el módulo.

gracias

¿Fue útil?

Solución

La sintaxis correcta para combinar las condiciones de diferentes campos con o es:

->addFieldToFilter(
    array(
        'title',
        'author',
        'summary'
    ),
    array(
        array('like' => $needleSearch),
        array('like' => $needleSearch),
        array('like' => $needleSearch),
    )
);

es.Para pasar una matriz de campos y una matriz de condiciones.Los elementos de estos matrices con las mismas claves se tratarán como si fueran pasadas como parámetros únicos.

Otros consejos

¿Has intentado algo como esto?

$collection
    ->getSelect()
    ->where("(something like 'abc') OR (something_else LIKE 'doremi')");

PS: Debe preocuparse por la inyección de SQL

Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top