Тема: Join запросы

Здравсвуйте! Столкнулся со следующей проблемой:

Начал писать блок контроллер, который получает все товары из категории, имеющие также определенную спецкатегорию, в которой находится пользователь. Надеюсь, нормально объяснил.

// $current_dir->id - id текущей директории
// $specdir_id - id спецкатегории

        $products = \RS\Orm\Request::make()
            ->from(new \Catalog\Model\Orm\Product, 'P')
            ->join(new \Catalog\Model\Orm\Dir, 'Dir.id = P.maindir', 'Dir')
            ->join(new \Catalog\Model\Orm\Xdir(), 'Xdir.product_id = P.id', 'Xdir' )
            ->where(['P.maindir' => $current_dir->id])
            ->where(['Xdir.dir_id' => $specdir_id])->object();

Если вывести с помощью echo, то запрос SQL будет выглядить следующим образом:
SELECT * FROM `homestead`.`iqay_product` as P INNER JOIN `homestead`.`iqay_product_dir` as Dir ON Dir.id = P.maindir INNER JOIN `homestead`.`iqay_product_x_dir` as Xdir ON Xdir.product_id = P.id WHERE (`P`.`maindir` = '2') AND (`Xdir`.`dir_id` = '26')

Запустив его в SQL я получаю в ответ 1 - 2 поля, в зависимости от спецкатегории, т.е. все происходит как надо.

Но сам запрос через ORM при получении объектов товаров, почему-то в свойство alias подставляет alias текущей категории, где вызывается блок контроллер.

Например: Категория Лазерные комплексы Raylogic 11G с алиасом lazernye-kompleksy-raylogic-11g. В нем товар, который также имеет спецкатегорию. Товар: Лазерный комплекс Raylogic (Рэйлоджик) 11G 1610 Лайт с алиасом lazernyy-kompleks-raylogic-reylodzhik-11g-1610-layt. Т.е. алиас неверны, то и ссылка строится кривая при использовании метода $product->getUrl().  В ответ получаю http://joxi.ru/brRJzBMHJVwK4r. Все смешанно

Помогите составить корректный запрос, или, возможно, есть уже встроенные методы, которые я проглядел.

Повысить оценку Понизить оценку

2 Отредактировано Закусило Александр (16.08.2018 19:33:48)

Re: Join запросы

Ну так правильно,  Вас же получается несколько одинаковых полей в таблице которые вы записываете в объект. Вы же выборку делаете полей товара и категории. И т.к. таблица категории прибавляется после товара, то и в объект попадает последняя. Т.е. у Вас в SELECT нужно указать нужные поля только из товара.

Я думаю примерно так:

 $products = \RS\Orm\Request::make()
           ->select('P.*')
            ->from(new \Catalog\Model\Orm\Product, 'P')
            ->join(new \Catalog\Model\Orm\Dir, 'Dir.id = P.maindir', 'Dir')
            ->join(new \Catalog\Model\Orm\Xdir(), 'Xdir.product_id = P.id', 'Xdir' )
            ->where(['P.maindir' => $current_dir->id])
            ->where(['Xdir.dir_id' => $specdir_id])->object();

3

Re: Join запросы

Точно, я же селект первым не указал. А поля одинаковые. Спасибо,  Александр!

Повысить оценку Понизить оценку

4

Re: Join запросы

Снова столкнулся с проблемой, как реализовать запрос типа:

SELECT * FROM `homestead`.`iqay_product` WHERE `maindir` NOT IN ('3','4','6','7','24','25')

Как добавить NOT используя ORM ?

\RS\Orm\Request::make()
            ->from(new Product)
            ->whereIn('maindir', $ids)

Повысить оценку Понизить оценку

5 Отредактировано Закусило Александр (24.08.2018 00:21:37)

Re: Join запросы

->where('Нужная строка')