Как выбрать ресурсы с 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, 14:45    Андрей   
1    271 0

Комментарии (5)

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

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