AddFieldToFilter () 'или' Запрос на неверных данных, не имеющих странного

magento.stackexchange https://magento.stackexchange.com//questions/89201

  •  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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с magento.stackexchange
scroll top