Nik_ADA 02 сентября 2015 0 7
Добрый день, нужен совет или точек в каком направлении двигаться.
Начал делать фильтры, расширил класс, все роде работает нормально.

При реализации фильтрования почему-то работает только с 1 параметром если выбрать 2 уже почему то не очень хочет искать.

Добавил выборку по TV

$c->leftJoin('modTemplateVarResource','TVResources', 'TVResources.contentid = Product.resource_id');
$c->leftJoin('modTemplateVar','TemplateVar', 'TVResources.tmplvarid = TemplateVar.id');


ну и само условие where
foreach ($tvFilters as $value) {
    $key = explode("==", $value);
    $filter['TemplateVar.name'] = $key[0];
    $filter['TVResources.value:='] = $key[1];
    $c->where($filter);
}


и так тоже пробовал
$filter_array = array();
foreach ($tvFilters as $value) {
    $key = explode("==", $value);
    $filter['TemplateVar.name'] = $key[0];
    $filter['TVResources.value:='] = $key[1];
    $filter_array[] = $filter;
}
$c->where($filter_array);


с 1 значением выводит если выбрать уже 2 TV поля то уже перестает работать.

Подскажите в чем у меня ошибка, в каком направлении копать.
7 комментариев
Fi1osof1
Fi1osof 03 сентября 2015г в 09:54 #
Копать в сторону изучения SQL. Не может у тебя одно TV поле называться и 'somename_1' и 'somename_2'. А у тебя при указании двух параметров формируется запрос where tv_name = 'somename_1' AND tv_name = 'somename_2';
Nik_ADA1
Nik_ADA 03 сентября 2015г в 13:42 #
Запросы у меня создаются примерно такие

WHERE  (
( `modResource`.`deleted` = 0 AND `modResource`.`hidemenu` = 0 AND `modResource`.`published` = 1 )  
AND `modResource`.`parent` IN (156,178,179,180,181,182,183,184,185,186,187,188,189,190,191)
AND (
( `TemplateVar`.`name` = 'shape' AND `TVResources`.`value` = 'rectangle' )  AND  ( `TemplateVar`.`name` = 'processing_edge' AND `TVResources`.`value` = '10' )
)
)

или

WHERE  (
( `modResource`.`deleted` = 0 AND `modResource`.`hidemenu` = 0 AND `modResource`.`published` = 1 )  
AND `modResource`.`parent` IN (156,178,179,180,181,182,183,184,185,186,187,188,189,190,191)
AND  ( `TemplateVar`.`name` = 'shape' AND `TVResources`.`value` = 'rectangle' )  AND  ( `TemplateVar`.`name` = 'processing_edge' AND `TVResources`.`value` = '10' )
)


Каждое поле по отдельности, но не как не вместе
Fi1osof1
Fi1osof 03 сентября 2015г в 13:47 #
Потому и говорю «учи SQL». Ты не совсем понимаешь принципа работы базы данных. Каждая выбранная строка должна соответствовать всем указанным условиям. Возьми из всех своих строк только одну. Будет ли в ней name равняться сразу и 'shape' и 'processing_edge'? Это физически не возможно. У тебя должно быть примерно так:
WHERE  (
( `modResource`.`deleted` = 0 AND `modResource`.`hidemenu` = 0 AND `modResource`.`published` = 1 )  
AND `modResource`.`parent` IN (156,178,179,180,181,182,183,184,185,186,187,188,189,190,191)
AND  (
( `TemplateVar`.`name` = 'shape' AND `TVResources`.`value` = 'rectangle' )  OR ( `TemplateVar`.`name` = 'processing_edge' AND `TVResources`.`value` = '10' )
)
)
Nik_ADA1
Nik_ADA 04 сентября 2015г в 01:10 #
ладно а как тогда построить запросто что бы он проверил 2 TV в одном ресурсе,
Fi1osof1
Fi1osof 05 сентября 2015г в 13:46 #
modxclub.ru/blog/voprosy-spetsyalistov/256.html
$alias = $c->getAlias();
$c->innerJoin('modTemplateVarResource',  'tv_shape', "tv_shape.contentid = {$this->classKey}.id AND tv_shape.tmplvarid = $tv_shape_id AND tv_shape.value='rectangle'");
$c->innerJoin('modTemplateVarResource',  'tv_processing_edge', "tv_processing_edge.contentid = {$this->classKey}.id AND tv_processing_edge.tmplvarid = $tv_processing_edge_id AND tv_processing_edge.value='10'");
Nik_ADA1
Nik_ADA 07 сентября 2015г в 00:40 #
Николай большое спасибо за помощь, все работает.
Fi1osof1
Fi1osof 07 сентября 2015г в 00:42 #
Пожалуйста.
Авторизуйтесь или зарегистрируйтесь (можно через соцсети ), чтобы оставлять комментарии.