addfelttofilter () 'o' query su dati non eav facendo qualcosa di strano
-
13-12-2019 - |
Domanda
Sto modificando i risultati della ricerca Magento per includere categorie, pagine e post di blog corrispondenti (dalla versione gratuita di NeotheMe Nblog).Mentre le categorie e le pagine stanno lavorando bene, c'è qualcosa di molto strano in corso con i post del blog.I post sembrano essere conservati in un tavolo, non-eav, tavolo.
Quando lo faccio, cercando "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 query di selezione risultante finisce con questo nel mezzo:
((`title`.`%test%` = '') OR (`author`.`%test%` = '') OR (`summary`.`%test%` = ''))
.
L'array annidato per il valore o funziona bene per l'EAV (categorie e pagine).
Questo produce anche lo stesso risultato:
->addFieldToFilter(
array(
array("title","like"=>$needleSearch),
array("author","like"=>$needleSearch),
array("summary","like"=>$needleSearch)
)
)
.
Mettere la matrice () intorno al bit simile termina con la query SQL che mostra
...(`title`.`array` = '') OR...
.
Un singolo lavoro simile:
$posts = Mage::getModel("neotheme_blog/post")
->setStoreId($storeId)
->getCollection()
->addStoreFilter()
->addFieldToFilter( 'title', array('like'=>$needleSearch) )
;
.
Mi stavo chiedendo se qualcuno avesse avuto idea di cosa potrebbe andare avanti?Non riesco a trovare un override di addfelttofilter () nel modulo.
Grazie
Soluzione
La sintassi corretta per combinare condizioni di diversi campi con o è:
->addFieldToFilter(
array(
'title',
'author',
'summary'
),
array(
array('like' => $needleSearch),
array('like' => $needleSearch),
array('like' => $needleSearch),
)
);
.
I.e.Per passare una serie di campi e una serie di condizioni.Gli elementi di questi array con gli stessi tasti saranno trattati come se fossero passati come parametri singoli.
Altri suggerimenti
Hai provato qualcosa del genere?
$collection
->getSelect()
->where("(something like 'abc') OR (something_else LIKE 'doremi')");
.
PS: dovresti preoccuparti dell'iniezione SQL