ActiveRecord
ActiveRecord
Здравствуйте! Не могу написать правильно запрос в БД.
Помогите разобраться, как правильно сделать запрос.
Мне нужно получить все товары в которых attributes.value = 32 and attributes.value = 'black'.
В данном примере это NIKE
Помогите разобраться, как правильно сделать запрос.
Мне нужно получить все товары в которых attributes.value = 32 and attributes.value = 'black'.
В данном примере это NIKE
- Dominus
- Сообщения: 892
- Зарегистрирован: 2013.03.14, 21:27
- Откуда: Россия, Иваново
- Контактная информация:
Re: ActiveRecord
Если без связи в модели ModelGoods:
Если есть связь в модели ModelGoods, что правильнее, то:
где getRelationsAttributes() название связи hasMany с моделью ModelAttributes в модели ModelGoods.
http://www.yiiframework.com/doc-2.0/yii ... ecord.html
http://www.yiiframework.com/doc-2.0/gui ... ecord.html
Код: Выделить всё
$result = ModelAttributes::find()->where(['good_id' => 2])->andWhere(['value' => ['32', 'black']])->all();
Код: Выделить всё
$model = ModelGoods::findOne(2);
$result = $model->getRelationsAttributes()->where(['value' => ['32', 'black']])->all();
http://www.yiiframework.com/doc-2.0/yii ... ecord.html
http://www.yiiframework.com/doc-2.0/gui ... ecord.html
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Re: ActiveRecord
не ... ему надо AND ...Dominus писал(а): ↑2017.12.12, 16:00Код: Выделить всё
$result = ModelAttributes::find()->where(['good_id' => 2])->andWhere(['value' => ['32', 'black']])->all();
тут надо бы еще добавить group by и having count =2
и where(['good_id' => 2]) ему не надо ... т.к. ему надо найти этот good_id запросом выше ...
- Dominus
- Сообщения: 892
- Зарегистрирован: 2013.03.14, 21:27
- Откуда: Россия, Иваново
- Контактная информация:
Re: ActiveRecord
А, наоборот, ну тогда можно так:
Код: Выделить всё
$attributes = ModelAttributes::find()->where(['value' => ['32', 'black']])->all();
$goods = [];
foreach($attributes as $attribute) {
$goods[] = ModelGoods::findOne($attribute->good_id);
}
var_dump($goods);
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Re: ActiveRecord
и так тоже не прокатит ... так достанет все 32 и все черные ... а автору поста надо 32 AND черные )
да и вообще это странный код
ведь можно вместо all column и потом достать сразу все ModelGoods а не по одной ...
да и вообще это странный код
ведь можно вместо all column и потом достать сразу все ModelGoods а не по одной ...
- Dominus
- Сообщения: 892
- Зарегистрирован: 2013.03.14, 21:27
- Откуда: Россия, Иваново
- Контактная информация:
Re: ActiveRecord
Что то я вообще не въезжаю что нужно
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Re: ActiveRecord
запрос: дайте мне 32 размер черного цвета
а ваш запрос возвратит весь товар 32го размера (любого цвета) и весь товар черного цвета (любого размера)
а ваш запрос возвратит весь товар 32го размера (любого цвета) и весь товар черного цвета (любого размера)
Re: ActiveRecord
Всем спасибо.
От так работает
От так работает
Код: Выделить всё
Goods::find()
->from(Goods::tableName() . ' AS g')
->innerJoin(['a_32' => Attributes::find()->select('good_id')->where(['value' => 32])], 'g.id = a_32.good_id')
->innerJoin(['a_black' => Attributes::find()->select('good_id')->where(['value' => 'black'])], 'g.id = a_black.good_id')
->all()
Re: ActiveRecord
идеи для размышления ... можно еще такими вариантами решить:
смотрите что быстрее будет работать ...
Код: Выделить всё
// это вариант через запросы, каждый отсеивающий то goods в которых нет нужного аттрибута
$values = ['32', 'черные'];
$goods_id=null;
foreach($values as $value)
{
$query = Attributes::find()->select('good_id')->where(['value'=>$value]);
if ($goods_id!==null){
if (count($goods_id)==0) break;
$query->andWhere(['good_id'=>$goods_id]);
}
$goods_id = $query->column();
}
$goods = ($goods_id!==null && count($goods_id)>0)?Goods::find()->where(['id'=>$goods_id])->all():[];
//а это вариант с группировкой...
$values = ['32', 'черные'];
$goods_id = Attributes::find()
->select('good_id')
->where(['value'=>$values])
->groupBy("good_id")
->having(new Expression("count(*)=".count($values)))
->column();
$goods = (count($goods_id)>0)?Goods::find()->where(['id'=>$goods_id])->all():[];