AddFieldToFilter () 'или' Запрос на неверных данных, не имеющих странного
-
13-12-2019 - |
Вопрос
Я изменяю результаты поиска Magento, чтобы включить сопоставленные категории, страницы и сообщения в блоге (от бесплатной версии NLBLOG NEOTHEME).Хотя категории и страницы работают просто хорошо, есть что-то очень странное происходящее со сообщениями в блоге.Посты, по-видимому, хранятся в плоском, не-EAV, таблице.
Когда я сделаю это, в поисках «теста»:
$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
;
.
Полученный запрос выбора заканчивается с этим в середине:
((`title`.`%test%` = '') OR (`author`.`%test%` = '') OR (`summary`.`%test%` = ''))
.
Вложенный массив для или отлично работает для EAV (категории и страницы).
Это также производит тот же результат:
->addFieldToFilter(
array(
array("title","like"=>$needleSearch),
array("author","like"=>$needleSearch),
array("summary","like"=>$needleSearch)
)
)
.
Установка массива () вокруг подобного бита заканчивается с помощью запроса SQL, показывающей
...(`title`.`array` = '') OR...
.
один, как работает работает:
$posts = Mage::getModel("neotheme_blog/post")
->setStoreId($storeId)
->getCollection()
->addStoreFilter()
->addFieldToFilter( 'title', array('like'=>$needleSearch) )
;
.
Мне было интересно, если бы у кого-то есть какие-то идеи о том, что может происходить?Я не могу найти переопределение ADDFieldToFilter () в модуле.
Спасибо
Решение
Правильный синтаксис для объединения условий
->addFieldToFilter(
array(
'title',
'author',
'summary'
),
array(
array('like' => $needleSearch),
array('like' => $needleSearch),
array('like' => $needleSearch),
)
);
.
I.e.пройти массив полей AN и массив условий.Элементы этих массивов с одинаковыми клавишами будут рассматриваться как если бы их были переданы как отдельные параметры.
Другие советы
Вы пробовали что-то вроде этого?
$collection
->getSelect()
->where("(something like 'abc') OR (something_else LIKE 'doremi')");
.
PS: Вы должны беспокоиться о инъекции SQL