pdoResource - проблема с NULL в &where=``

Василий, привет!

Нужны мне вот такие условия в запросе:
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.

Как это обойти — не знаю. Посоветуй что-нибудь, пожалуйста!
Алексей Карташов
24 августа 2013, 12:31
modx.pro
2
7 009
0

Комментарии: 12

Василий Наумкин
24 августа 2013, 17:25
1
0
Попробуй так:
&where=`["
	show_in_main != 1 OR show_in_main IS NULL
"]`

Ну и еще вот тут много информации.
    Алексей Карташов
    24 августа 2013, 17:43
    0
    Ту статью до этого не видел, но да, проверка на NULL нужна именно из-за того, что там написано.

    Попробовал написать так, как ты предложил — ничего не вышло, но заработал вот такой вариант:
    &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-условия были написаны без массива, т.е. без '[]'. А тестировал я как положено. Статью поправил.
      Василий Наумкин
      24 августа 2013, 17:47
      1
      0
      Ну ты чего, не уложняй.

      Если писать как я показываю — это чистое SQL условие. Добавляй там скобочки, никаких массивов не нужно.
      Поэтому имена ТВ и не заменяются — ибо обработки нет никакой.

      То есть, это строка в JSON:
      &where=`["
      	Здесь чистое SQL условие, как оно будет при вызове сниппета, со скобочками и прочим.
      "]`
        Алексей Карташов
        24 августа 2013, 17:51
        0
        Точно, забыл, что скобки в этом случае надо писать самостоятельно :-)

        Спасибо!
          Алексей
          20 июня 2014, 22:07
          0
          такое условие прекрасно работает с 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}`
          работает и с аякс и с прямой загрузкой странички. Но тут не поставить скобочки, чтоб их.
            Алексей
            20 июня 2014, 23:02
            0
            очень странно — почистил табличку modx_session — и все заработало.
              Алексей
              12 марта 2015, 14:10
              0
              опять помогло то же решение) похоже в таблицу пишется какая-то нужная информация, которая при настройке мешает нормальной работе
                Алексей
                15 июня 2015, 18:50
                0
                начал копать в чем дело — 3й раз спотыкаюсь при настройке.
                в табличке modx_session пишется информация вида:
                s:16:"filter_delimeter";s:1:"|";s:7:"filters";s:203:"
                	ms|price:number,
                	msoption|size:default,
                	resource|parent:categories,
                — в общем весь шаблон для построения фильтров mSearch.
          Алексей Карташов
          24 августа 2013, 17:50
          0
          Всё, отбой! Заработало!

          В яваскрипте ж нету значения 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.
          Алексей
          24 февраля 2016, 18:11
          1
          0
          Тоже долго искал решения для 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, которым не присвоено ни одного тэга.
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          12