SQL-запрос в сниппете фильтрации ресурсов по набору tv

Доброго времени суток!

Пишу сниппет фильтрации ресурсов по набору tv-полей и столкнулся со странной отработкой запроса.

Логика и примеры результатов отработки запроса под катом.

Если подробнее, то есть некий, передаваемый сниппету, массив значений tv-полей, например:
[8] => 'Значение tv_8',
	[11] => 'Значение tv_11',
	[13] => 'Значение tv_13',
	[16] => 'Значение tv_16'
	и т.д.
, где:
  • ключ — id tv-поля,
  • значение — передаваемое сниппету значение

В сниппете каждый элемент этого массива (кроме обязательного с ключом 8) в цикле добавляется в массив $where_for_clear_sql:
$where_for_clear_sql[] = "(mstcv.tmplvarid = ".$filter." AND mstcv.value LIKE '%".$value."%')";

Затем формирую запрос:
$q = "SELECT msc.id, msc.content, mstcv.tmplvarid, mstcv.value 
	 FROM modx_site_content as msc 
	 INNER JOIN modx_site_tmplvar_contentvalues as mstcv ON msc.id = mstcv.contentid 
	 WHERE (msc.parent = 87 AND msc.published = 1) AND
		     (mstcv.tmplvarid = 8 AND mstcv.value = ".$_POST['8'].") 
		     ".( (count($where_for_clear_sql) == 0) ? '' : "AND (".implode(' OR ', $where_for_clear_sql).") ")."
	 ORDER BY msc.pagetitle ASC";


Казалось бы всё логично: в запросе обязательно учитывается родитель в котором искать ресурсы, чтобы эти ресурсы были опубликованы, чтобы tv с id 8 у этих ресурсов был равен определённому значению. Затем идут необязательные поля. При выборе бОльшего количества необязательных полей критерии поиска должны сужаться. Но результатов не находится вовсе, хотя ресурсы с такими параметрами есть.

Например, есть 3 ресурса:
id ресурса | tv_8 | tv_11 | tv_13 | tv_16 | ...
================================================
    156    |  1   | Текст |   0   |   1   | ...
    234    |  5   |       |   1   |   0   | ...
    300    |  5   | проба |   0   |   0   | ...

При передаче массива
[8] => '1'
отображается ресурс с id 156

При передаче массива
[8] => '5'
отображаются ресурсы с id 234 и 300.

Но стоит добавить в массив необязательные поля
[8] => '5',
	[11] => '',
	[13] => '1',
	[16] => '1'
	и т.д.
как ни одного результата найдено не будет (хотя один ресурс, удовлетворяющий такому набору значений tv есть).

Ломаю голову уже второй день и не могу понять, почему этот запрос так не естественно отрабатывается. И, как я понимаю, при implode(' OR ', $where_for_clear_sql) сужение критериев поиска мне не дождаться, а при implode(' AND ', $where_for_clear_sql) и, например таком массиве:
[8] => '5',
	[11] => '',
	[13] => '1',
	[16] => '1'
	и т.д.
никаких результатов сниппет не вернёт.

Засомневался вообще в возможности написать такой запрос, чтобы выводил результаты и чем больше параметров выбрано тем точнее результаты.

Кто-то писал что-то похожее? Подскажите, пожалуйста, как выйти из такой запутанной ситуации?
Евгений
27 июня 2018, 18:52
modx.pro
792
0

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

Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
0