Как выбрать ресурсы с TV c пустым значением?
Здравствуйте.
Нужно выбрать товары у которых значение ТВ поля пусто.
Пробовал разные варианты в where, везде выдает 0
Если писать 'site_id.value:!=' => null, то выводит верно, т.е. код работает.
Как выбрать товары с пустым полем?
Нужно выбрать товары у которых значение ТВ поля пусто.
Пробовал разные варианты в 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, то выводит верно, т.е. код работает.
Как выбрать товары с пустым полем?
Комментарии: 5
Раз вы уже начали писать свой сниппет, значит будет немного проще. Я понимаю, что вы думаете, что делаете все правильно, но на деле не понимаете один ньюанс. Дело в том, что если значение TV не задано (т.е. пусто по вашему), то этого значения вовсе нет. Т.е. его вовсе не существует в таблице значений tv (там где хранятся modTemplateVarResource). Следовательно проверить на пустоту пустоту нельзя. Только на null (что у вас в итоге и работает).
Если я правильно понял, то в вашем случае должна помочь инверсия. Нужно сначала найти те значения TV, которые уже установлены (существуют в таблице), получить из них значения contentid и полученный массив id ресурсов передать в условие выборки ресурсов NOT IN (resourceid1,resourceid2,...).
Если я правильно понял, то в вашем случае должна помочь инверсия. Нужно сначала найти те значения TV, которые уже установлены (существуют в таблице), получить из них значения contentid и полученный массив id ресурсов передать в условие выборки ресурсов NOT IN (resourceid1,resourceid2,...).
Да, так работает, спасибо. Не знал, что не заданные TV не хранятся нигде.
Недавно решал подобную задачу, msProducts или pdoResources тут не помогут, как верно написал Иван Климчук, они могут искать только по заполненным значениям TV, это даже подчеркнуто в документации. Помог getResources, в его вызове надо использовать параметр &tvFilters=`price===||price===0` — это для случая, когда цена хранится в TV поле.
А если так попробовать?
$с->where([
'site_id.value' => '',
'OR:site_id.value:IS' => NULL
]);
Неа, так тоже 0.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.