Как выбрать ресурсы с 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
modx.pro
1
1 636
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.
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        5