Как выбрать ресурсы с TV c пустым значением?

Здравствуйте.

Нужно выбрать товары у которых значение ТВ поля пусто.

Пробовал разные варианты в where, везде выдает 0

$c = $modx->newQuery('msProduct');
$c->innerJoin('modTemplateVarResource', 'site_id', [
  'msProduct.id = site_id.contentid',
  'site_id.tmplvarid = 23',
]);
$c->where([
  'site_id.value' => null,
  //'site_id.value' => '',
  //'site_id.value:IS' => null,
  //'site_id.value:IS' => '',
  //'site_id.value:=' => null,
  //'site_id.value:=' => '',
]);

$goods = $modx->getCount('msProduct', $c);

Если писать 'site_id.value:!=' => null, то выводит верно, т.е. код работает.

Как выбрать товары с пустым полем?
Андрей
26 декабря 2016, 11:45
1
511
0

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

Иван Климчук
27 декабря 2016, 00:00
+2
Раз вы уже начали писать свой сниппет, значит будет немного проще. Я понимаю, что вы думаете, что делаете все правильно, но на деле не понимаете один ньюанс. Дело в том, что если значение TV не задано (т.е. пусто по вашему), то этого значения вовсе нет. Т.е. его вовсе не существует в таблице значений tv (там где хранятся modTemplateVarResource). Следовательно проверить на пустоту пустоту нельзя. Только на null (что у вас в итоге и работает).

Если я правильно понял, то в вашем случае должна помочь инверсия. Нужно сначала найти те значения TV, которые уже установлены (существуют в таблице), получить из них значения contentid и полученный массив id ресурсов передать в условие выборки ресурсов NOT IN (resourceid1,resourceid2,...).
    Андрей
    27 декабря 2016, 09:36
    0
    Да, так работает, спасибо. Не знал, что не заданные TV не хранятся нигде.
Igor Ivanov
27 декабря 2016, 06:53
0
Недавно решал подобную задачу, msProducts или pdoResources тут не помогут, как верно написал Иван Климчук, они могут искать только по заполненным значениям TV, это даже подчеркнуто в документации. Помог getResources, в его вызове надо использовать параметр &tvFilters=`price===||price===0` — это для случая, когда цена хранится в TV поле.
Илья Уткин
27 декабря 2016, 08:25
0
А если так попробовать?
$с->where([
  'site_id.value' => '',
  'OR:site_id.value:IS' => NULL
]);
    Андрей
    27 декабря 2016, 09:36
    0
    Неа, так тоже 0.