ActiveRecord как сформировать запрос? [Решено]

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
grig
Сообщения: 41
Зарегистрирован: 2014.12.21, 23:42

ActiveRecord как сформировать запрос? [Решено]

Сообщение grig »

Доброго дня! Есть такая конструкция:

Код: Выделить всё

 $goods = Goods::find()
                ->andFilterWhere(['good_id' => $this->good_id])
                ->andFilterWhere(['like', 'good_name', explode(' ', $this->goodName)])
                ->andFilterWhere(['good_sell_price' => $this->sell_price])
                ->andFilterWhere(['good_buy_price' => $this->buy_price])
                ->andFilterWhere(['archive' => 0])
                ->orWhere(['good_id'=>$ids])
                ->all(); 
Вопрос в следующем: можно ли как-то дополнить данную конструкцию, чтобы можно было изменить первую часть условия (до where), написав например вместо стандартного Select * написать Select *, if(good_id in (1,2,3),1,0) as sort
Нужно для поиска в гриде. По факту должен получиться примерно такой запрос:

Код: Выделить всё

SELECT *, if(good_id in (1,2,3),1,0) as sort FROM `goods` WHERE ((`good_name` LIKE '%test%') AND (`archive`=0)) OR (`good_id` IN (2, 11)) ORDER by sort DESC
Вопрос как это сделать не прибегая к чистому sql?
Последний раз редактировалось grig 2015.02.24, 22:36, всего редактировалось 1 раз.
Demon_id
Сообщения: 421
Зарегистрирован: 2011.10.29, 00:13

Re: ActiveRecord как сформировать запрос?

Сообщение Demon_id »

Код: Выделить всё

$goods = Goods::find()
->select([
    '*',
    new \yii\db\Expression('if(good_id in (1,2,3),1,0) as sort')
])
->andFilterWhere(['good_id' => $this->good_id])
->andFilterWhere(['like', 'good_name', explode(' ', $this->goodName)])
->andFilterWhere(['good_sell_price' => $this->sell_price])
->andFilterWhere(['good_buy_price' => $this->buy_price])
->andFilterWhere(['archive' => 0])
->orWhere(['good_id'=>$ids])
->all(); 
grig
Сообщения: 41
Зарегистрирован: 2014.12.21, 23:42

Re: ActiveRecord как сформировать запрос?

Сообщение grig »

Большое спасибо! То что надо.
grig
Сообщения: 41
Зарегистрирован: 2014.12.21, 23:42

Re: ActiveRecord как сформировать запрос?

Сообщение grig »

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

Код: Выделить всё

 public function getPhoto()
    {
        return $this->hasMany(Photo::className(), ['good_id' => 'id']);
    }
Что не могу понять как это использовать красиво в данной конструкции ( andWhere() ).
Аватара пользователя
vitalik1183
Сообщения: 1675
Зарегистрирован: 2014.07.01, 08:42

Re: ActiveRecord как сформировать запрос?

Сообщение vitalik1183 »

hasMany()->where()
Yii2!
Demon_id
Сообщения: 421
Зарегистрирован: 2011.10.29, 00:13

Re: ActiveRecord как сформировать запрос?

Сообщение Demon_id »

vitalik1183 писал(а):hasMany()->where()
это жестко зажимает рилейшн. гораздо лучше гнуть критерию по месту надобности.

Код: Выделить всё

$query->innerJoinWith([
        'productImages' => function ($query) {
            //$query->andWhere(....);    // uncoment if need where cindition
        },
    ]); 
Аватара пользователя
vitalik1183
Сообщения: 1675
Зарегистрирован: 2014.07.01, 08:42

Re: ActiveRecord как сформировать запрос?

Сообщение vitalik1183 »

Весьма спорный момент. А если это "место надобности" находится в 15 местах? Мне кажется лучше ввести доп. метод и оперировать им.
Yii2!
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: ActiveRecord как сформировать запрос?

Сообщение zelenin »

vitalik1183 писал(а):Весьма спорный момент. А если это "место надобности" находится в 15 местах? Мне кажется лучше ввести доп. метод и оперировать им.
надо добавить scope и все.
grig
Сообщения: 41
Зарегистрирован: 2014.12.21, 23:42

Re: ActiveRecord как сформировать запрос?

Сообщение grig »

Спасибо большое! Вариант с JoinWith больше поошел в моей ситуации. На всякий случай приведу пример кода:

Код: Выделить всё

$query->innerJoinWith([
            'photo' => function ($query) {
                $query->from('tbl_photo ph');
            }]);
            $query->groupBy('ph.good_id');
Если у нас есть таблица с товарами/пользователями и т.д., а так же таблица с фотками, которая связана с первой таблицей по общему полю, то можно применить такую конструкцию, чтобы достать только те товары, у которых есть хоть одна фотка.
Надеюсь кому-нибудь пригодится.
Ответить