Question

Je modifie les résultats de la recherche Magento pour inclure des catégories, des pages et des articles de blog correspondants (à partir de la version gratuite de Neotheme Nblog).Bien que les catégories et les pages fonctionnent bien, il y a quelque chose de très étrange avec les poteaux de blog.Les poteaux semblent être stockés dans un plat, non-EAV, table.

Quand je le fais, recherchez "Test":

$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 requête de sélection résultante finit avec ceci au milieu:

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

La matrice imbriquée pour l'amende ou fonctionne bien pour le EAV (catégories et pages).

Ceci produit également le même résultat:

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

Mise en place () autour du bit similaire se termine par la requête SQL montrant

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

Un seul des travaux similaires:

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

Je me demandais si quelqu'un avait une idée de ce qui pourrait se passer?Je ne trouve pas de remplacement de Addfieldofilter () dans le module.

merci

Était-ce utile?

La solution

la syntaxe correcte pour combiner des conditions de différents champs avec ou est:

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

I.e.transmettre un tableau de champs et une gamme de conditions.Les éléments de ces tableaux avec les mêmes clés seront traités comme s'ils étaient passés sous forme de paramètres uniques.

Autres conseils

Avez-vous essayé quelque chose comme ça?

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

PS: Vous devriez vous inquiéter d'injection SQL

Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top