pdoResource - проблема с NULL в &where=``
Василий, привет!
Нужны мне вот такие условия в запросе:
Как передать в &where=`` pdoResource'а проверку на NULL?
opengeek пишет, что надо использовать PHP NULL:
Но как это передать в строке json в вызове сниппета?
Если вызываю как в примере выше:
Если в вызове сниппета NULL пишу без кавычек:
Как это обойти — не знаю. Посоветуй что-нибудь, пожалуйста!
Нужны мне вот такие условия в запросе:
SELECT <...>
WHERE `modResource`.`parent` IN (103,104,105,107,106,108,109,110,115,120) AND (`TVshow_in_main`.`value` != 1 OR `TVshow_in_main`.`value` IS NULL)
Вызываю вот так:[[pdoResources?
&tpl=`tpl.article.preview`
&parents=`103`
&includeTVs=`show_in_main`
&where=`[{"show_in_main:!=": "1", "OR:show_in_main:IS": "NULL"}]`
&tvPrefix=``
&showLog=`1`
]]
pdoResource всё отлично джойнит и работает как надо, но...Как передать в &where=`` pdoResource'а проверку на NULL?
opengeek пишет, что надо использовать PHP NULL:
$query->where(array("Tsearch.system_brand_id:IS" => NULL));
Но как это передать в строке json в вызове сниппета?
Если вызываю как в примере выше:
&where=`[{"show_in_main:!=": "1", "OR:show_in_main:IS": "NULL"]}`
, то в сниппет приходит строка «NULL», а не тип NULL, и в запросе получается вот так:IS 'NULL'
Если в вызове сниппета NULL пишу без кавычек:
&where=`[{"show_in_main:!=": "1", "OR:show_in_main:IS": NULL]}`
, то ошибка парсинга json.Как это обойти — не знаю. Посоветуй что-нибудь, пожалуйста!
Комментарии: 12
Попробуй так:
Ну и еще вот тут много информации.
&where=`["
show_in_main != 1 OR show_in_main IS NULL
"]`
Ну и еще вот тут много информации.
Ту статью до этого не видел, но да, проверка на NULL нужна именно из-за того, что там написано.
Попробовал написать так, как ты предложил — ничего не вышло, но заработал вот такой вариант:
p.s. в статье была ошибка — json-условия были написаны без массива, т.е. без '[]'. А тестировал я как положено. Статью поправил.
Попробовал написать так, как ты предложил — ничего не вышло, но заработал вот такой вариант:
&where=`["TVshow_in_main.value != 1 OR TVshow_in_main.value IS NULL"]`
Т.е. теперь условие формируется верно, но опять «но» — xpdo не соблюдает вложенность при таком варианте. Получается вот так:<...> AND TVshow_in_main.value != 1 OR TVshow_in_main.value IS NULL <...>
хотя должны были быть скобки:<...> AND (TVshow_in_main.value != 1 OR TVshow_in_main.value IS NULL) <...>
Попробовал в &where=`` сделать вложенный массив:&where=`[["TVshow_in_main.value != 1 OR TVshow_in_main.value IS NULL"]]`
Результата не принесло — условия снова без скобок. Даже и не знаю…p.s. в статье была ошибка — json-условия были написаны без массива, т.е. без '[]'. А тестировал я как положено. Статью поправил.
Ну ты чего, не уложняй.
Если писать как я показываю — это чистое SQL условие. Добавляй там скобочки, никаких массивов не нужно.
Поэтому имена ТВ и не заменяются — ибо обработки нет никакой.
То есть, это строка в JSON:
Если писать как я показываю — это чистое SQL условие. Добавляй там скобочки, никаких массивов не нужно.
Поэтому имена ТВ и не заменяются — ибо обработки нет никакой.
То есть, это строка в JSON:
&where=`["
Здесь чистое SQL условие, как оно будет при вызове сниппета, со скобочками и прочим.
"]`
Точно, забыл, что скобки в этом случае надо писать самостоятельно :-)
Спасибо!
Спасибо!
такое условие прекрасно работает с msearch2, но с ajax пагинацией возникает ошибка — could not load config
пример условия:
пример условия:
&where=`["(PParent.hidemenu!=1 OR PParent.hidemenu IS NULL) AND (PPParent.hidemenu!=1 OR PPParent.hidemenu IS NULL) AND (PPPParent.hidemenu!=1 OR PPPParent.hidemenu IS NULL)"]`
выводит ошибку при аякс пагинации\фильтрах (при перезагрузке по F5 отрабатывает как надо). Хотя вот так:&where=`{"PParent.hidemenu:!=":1, "AND:PPParent.hidemenu:!=":1, "AND:PPPParent.hidemenu:!=":1}`
работает и с аякс и с прямой загрузкой странички. Но тут не поставить скобочки, чтоб их.
очень странно — почистил табличку modx_session — и все заработало.
опять помогло то же решение) похоже в таблицу пишется какая-то нужная информация, которая при настройке мешает нормальной работе
начал копать в чем дело — 3й раз спотыкаюсь при настройке.
в табличке modx_session пишется информация вида:
в табличке modx_session пишется информация вида:
s:16:"filter_delimeter";s:1:"|";s:7:"filters";s:203:"
ms|price:number,
msoption|size:default,
resource|parent:categories,
— в общем весь шаблон для построения фильтров mSearch.
Всё, отбой! Заработало!
В яваскрипте ж нету значения NULL, есть только null.
Написал вот так:
&where=`[{«TVshow_in_main.value:!=»: «1», «OR:TVshow_in_main.value:IS»: null]}`
и всё ок — и вложенность соблюдается и условие IS NULL прописывается правильно.
Только если просто писать название заинклюденного tv-параметра, то в конечном запросе получается modResource.show_in_main. Поэтому TVshow_in_main.value.
В яваскрипте ж нету значения NULL, есть только null.
Написал вот так:
&where=`[{«TVshow_in_main.value:!=»: «1», «OR:TVshow_in_main.value:IS»: null]}`
и всё ок — и вложенность соблюдается и условие IS NULL прописывается правильно.
Только если просто писать название заинклюденного tv-параметра, то в конечном запросе получается modResource.show_in_main. Поэтому TVshow_in_main.value.
Тоже долго искал решения для IS NULL условия, никак не мог заставить pdoTools писать IS NULL, всегда было IS " NULL", но вот через fenom все заработало с первого раза:
{$_modx->runSnippet('pdoResources', [
'loadModels' => 'ms2gallery',
'class' => 'msResourceFile',
'where' => [
'parent' => 0,
'active' => 1,
'resource_id' => "{$_modx->resource.id}",
'tags.file_id:IS' => null
],
'limit' => 0,
....
Это для выборки изображений из галереи ms2gallery, которым не присвоено ни одного тэга.
Да и так вроде уже должно работать:
&where=`{"tags.file_id":null}`
Но Fenom, понятно, лучше со всех сторон.
Вроде, так
&where=`{"tags.file_id:IS":null}`
https://rtfm.modx.com/xpdo/2.x/class-reference/xpdoquery/xpdoquery.where
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.