pdoFetch поиск в TV-полях с разделителем ||
Наверняка много кто использовал в своей практике TV-поля типа «Список» (множественный, одиночный, не важно) или «Тег». Здесь важно именно то, в каком виде в базе данных хранятся данные таких полей, ведь они сохраняют множественные значения. А хранят они их одной общей строкой в той же самой таблице ТВшек (естественно, по одной записи на один документ). К примеру, если мы отметили три значения 100, 1005, 10, в БД это запишется 100||1005||10. И здесь возникает вопрос как потом выполнить поиск по таким полям? Простой LIKE здесь не поможет, так как LIKE %100%, к примеру, найдет и '100||1000' и '1001||1005'. Данного вопроса мы уже касались здесь и подобный вопрос опять возник здесь.
В подобных ситуациях нам в помощь SQL-метод FIND_IN_SET(). Он как раз и позволяет выполнять поиск с точным вхождениям в строках с разделителем-запятой. Правда, в нашем случае придется выполнить еще одну операцию — замену разделителя || на запятую. В этом нам поможет SQL-метод REPLACE.
Посмотрев код pdoFetch, на сколько я понял, через параметр tvFilters этого сделать нельзя, так как у него там ограниченный набор элементов сравнения (по умолчанию LIKE). А здесь нужен FIND_IN_SET(). Мы этот вопрос разбирали еще здесь. Здесь нам в помощь параметр where. В него можно передавать дополнительные условия поиска массивом или JSON-строкой.
Примерный запрос выглядит так:
1 = 1 необходимо, чтобы обойти ограничения xPDO, который имеет определенный набор разрешенных методов. Если мы этого не сделаем, то получим примерно такую ошибку: Error parsing condition with key 0: FIND_IN_SET(…
В подобных ситуациях нам в помощь SQL-метод FIND_IN_SET(). Он как раз и позволяет выполнять поиск с точным вхождениям в строках с разделителем-запятой. Правда, в нашем случае придется выполнить еще одну операцию — замену разделителя || на запятую. В этом нам поможет SQL-метод REPLACE.
Посмотрев код pdoFetch, на сколько я понял, через параметр tvFilters этого сделать нельзя, так как у него там ограниченный набор элементов сравнения (по умолчанию LIKE). А здесь нужен FIND_IN_SET(). Мы этот вопрос разбирали еще здесь. Здесь нам в помощь параметр where. В него можно передавать дополнительные условия поиска массивом или JSON-строкой.
Примерный запрос выглядит так:
[[!pdoPage?
&limit=`18`
&includeTVs=`categories`
&where=`["1 = 1 AND FIND_IN_SET('[[*id]]', replace(categories, '||', ','))"]`
]]В данном случае replace(categories, '||', ',') заменит все разделители || на, (зпт), что позволит искать четкие вхождения в составной строке методом FIND_IN_SET(). 1 = 1 необходимо, чтобы обойти ограничения xPDO, который имеет определенный набор разрешенных методов. Если мы этого не сделаем, то получим примерно такую ошибку: Error parsing condition with key 0: FIND_IN_SET(…
Комментарии: 19
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
А &tvFilters нужен исключительно для совместимости с getResources. Никому не рекомендую его использовать.
Fi1osofУ меня запрос такой:
id_pages представляет собой простую строку, куда я вручную прописываю id ресурсов (пример — 5||20||13).
Третий день бьюсь. Испробовал кучу вариантов, но нет.
Fi1osofFi1osofКак вариант сделать следующее:
Надеюсь смысл понятен. :) Синтаксис не проверял. Показал принцип.
Я в свою очередь тоже, т.к. боюсь меня не правильно поняли.
В базе Migx хранятся каталоги с описанием, картинкой и т.д.
Помимо родного ресурса эти каталоги нужно вывести и на многих других.
Соответственно, на этом этапе нужна выборка определенных каталогов для определенного ресурса.
Задачу пытался решить так:
создал в Migx базе еще одно поле, где вручную указываю id ресурсов (пример — 5||20||13).
А на странице определенного ресурса уже вызов сниппета, который написал выше, только рабочий вызов where пока такой:
Проблема в том, что в id_pages иногда приходится вставлять несколько id, тогда не работает.
У вас Есть Родитель, У него Ресурсы, у ресурсов TV (MIGX) с Описаниями, картинками? MIGX настроен обычным способом.
Вам нужно вывести на любой странице определенные ресурсы, которые вы указываете в другом родителе через TV поле?
Скиньте снипет ваш который рабочий, т.к. сложно понять что сейчас у вас не так. :)
Вызов сниппета на других ресурсах такой:
Но он работает только если в этом поле указан 1 id. А надо бы, чтобы сниппет мог отыскать id необходимого ресурса среди нескольких значений.
Кому будет тоже нужно:
В поле id_pages, id ресурсов нужно прописать так, чтобы их однозначно можно было определить.
Например, так:
2#3#
Условие where переписать на следующее:
в итоге рабочий вызов будет таким:
Подсказали тут: itchief.ru/lessons/modx-revo/modx-migx
Пробовал так:
Но результата нет
Fi1osofНадо так:
[«1 = 1 AND FIND_IN_SET({$modx->resource->id}, replace(categories, '||', ','))»]
или
[«1 = 1 AND FIND_IN_SET({$modx->getPlaceholder('id')}, replace(categories, '||', ','))»]
Это если в сниппете. Если вы в феном или еще где-то пишете, может чуть отличаться синтаксис, но смысл, думаю, вы уловили.
можно (правильней) написать
Fi1osofТогда уж и вовсе «FIND_IN_SET('Москва', from_city)», так как результат этой функции проверяется на true|false.
Fi1osofТолько там нативный объект $modx, в феноме вам надо использовать $_modx, вроде должно работать.
Подскажите, у меня вот такая конструкция:
Я вывожу видео из портфолио в товарах проверяя совпадения по названию товара. Но как и ожидалось, выводятся видео с похожими названиями. К примеру: — Калуга||Луга
Пытаюсь вывести по вашему примеру:
Но не пойму, как сделать ещё одни запрос «video.value:!=»:1
Извините, я не спец…
Спасибо!