Объединить выборки в контроллере показа.

#
Объединить выборки в контроллере показа.
Здравствуйте. Помогите, пожалуйста, разобраться... Мне нужно сделать вывод элементов со всех групп инфосистемы и из её корня. Но может быть такое, что группа удалена - она в корзине и в таблице имеет значение deleted=1. Тогда её элементы выводить не нужно. Делаю объединение таблиц элементов и групп по полю ид группы. И условие - где  deleted=0. Вот так:


$Informationsystem_Controller_Show
                              ->informationsystemItems()
                              ->queryBuilder()
   ->leftJoin('informationsystem_groups', 'informationsystem_group_id','=','informationsystem_groups.id')
   ->where('informationsystem_groups.deleted','=',0)


Все хорошо, но в таком случае не выводятся элементы из корня инфосистемы. И это правильно, поскольку это элементы с ид группы = 0. А по условию выборки объединились таблицы только с совпадающими ид групп - с нулем там нет. Значит, надо сделать вторую выборку, более простую:

$Informationsystem_Controller_Show
                              ->informationsystemItems()
                              ->queryBuilder()
   ->where('informationsystem_group_id','=',0)


и нужно результаты объединить. Понимаю, что нужно использовать union, но не понимаю как.... Подскажите, пожалуйста.
Модератор
#
Re: Объединить выборки в контроллере показа.
prizrak067,
у вас левое внешнее объединение, добавьте в него еще условие OR informationsystem_group_id = 0
#
Re: Объединить выборки в контроллере показа.
Спасибо за ответ. Верно понимаю, что нужно сделать вот так?

   $Informationsystem_Controller_Show
                              ->informationsystemItems()
                              ->queryBuilder()
                              ->leftJoin('informationsystem_groups', 'informationsystem_group_id','=','informationsystem_groups.id')
                              ->where('informationsystem_groups.deleted','=',0)                           
                              ->orWhere('informationsystem_group_id','=', 0);
Модератор
#
Re: Объединить выборки в контроллере показа.
prizrak067,
неправильно понимаете. Смотрите пример Полное объединение с дополнительными условиями. Только вместо join будет все также leftJoin
#
Re: Объединить выборки в контроллере показа.
что-то все равно не то...
$Informationsystem_Controller_Show
                              ->informationsystemItems()
                              ->queryBuilder()
                              ->leftJoin('informationsystem_groups', 'informationsystem_group_id','=','informationsystem_groups.id', array(
                                 array('OR' => array('informationsystem_groups.deleted', '=', 0)),
                                 array('OR' => array('informationsystem_group_id', '=', 0))
                                             ));
Модератор
#
Re: Объединить выборки в контроллере показа.
prizrak067,
чем вы руководствовались, когда добавляли именно эти условия? Разве я это советовал?!
#
Re: Объединить выборки в контроллере показа.
Извиняюсь, если неверно понял.. Как Вы указали на документацию:
Полное объединение с дополнительными условиями. Только вместо join будет все также leftJoin
Скрин места в документации: https://prnt.sc/xljesk
Модератор
#
Re: Объединить выборки в контроллере показа.
зайдем с другой стороны,
prizrak067 писал(а):
что-то все равно не то...

что именно не так?
#
Re: Объединить выборки в контроллере показа.
что именно не так?
В выборку попадают элементы удаленной группы, причем элементы дублируются.
Модератор
#
Re: Объединить выборки в контроллере показа.
согласно вашему запросу, вы выбираете товары, где id группы у товара совпадает с ID группы в таблице групп или любая запись в таблице групп не удалена или у товара ID группы равен 0. Работает ровно так, как вы написали. Вас должно очень сильно насторожить использование первого OR
Авторизация