Фильтровать коллекцию страниц CMS по названию или содержанию
Я работаю над модулем, чтобы сделать некоторые страницы CMS доступными для поиска в интерфейсе. Прямо сейчас у меня небольшие проблемы с фильтрацией страниц. Я получаю коллекцию, фильтрую ее по добавленному полю "is_searchable", которое работает нормально. Когда я пытаюсь отфильтровать его по названию или содержимому, используя оператор , подобный , он либо не возвращает результатов, либо каждый результат, независимо от того, соответствует ли это названию/содержимому вообще или нет. Вот что я использую, так что далеко:
$results = Mage::getModel('cms/page')->getCollection()
->addFieldToFilter('title', array('like'=> '%' . $search . '%'))
->addFieldToFilter('content', array('like'=>'%' . $search . '%'))
->addFieldToFilter('is_searchable', 1);
Я также попытался использовать addAttributeToFilter(), но получил сообщение об ошибке, что эта функция не существует в этой модели. Не уверен, что я здесь делаю неправильно, но любая помощь или направление будут оценены. Спасибо!
2 answers
Ответ @Mauronigrele близок, но фактический синтаксис для объединения нескольких условий для разных полей с OR
отличается.
Должно работать следующее:
$results = Mage::getModel('cms/page')->getCollection()
->addFieldToFilter(
['title', 'content'],
[['like' => "%{$search}%"], ['like' => "%{$search}%"]]
)
->addFieldToFilter('is_searchable', 1);
Вы можете найти более подробную документацию addFieldToFilter()
в этом ответе: addFilter vs addFieldToFilter
В этом запросе вы ищете страницы как с заголовком, так и с содержимым, например, я имею в виду $search, А не ИЛИ.
Если вам нужно построить оператор OR, правильный синтаксис:
$results = Mage::getModel('cms/page')->getCollection()
->addFieldToFilter(array(
array('field'=> 'title','like' => "%{$search}%"),
array('field'=> 'content','like' => "%{$search}%"),
))
->addFieldToFilter('is_searchable', 1);
Вы всегда можете просмотреть свой запрос, регистрирующий выбор:
Mage::log($results->getSelectSql(true),7,'my-sql.log');
Помните, что метод addAttributeToFilter()
доступен только для объектов EAV, и это: каталог_продукт, каталог_категория, клиент_кастомер и адрес_пользователя