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

Мне нужно получить все товары в которых attributes.value = 32 and attributes.value = 'black'.
В данном примере это NIKE
Код: Выделить всё
$result = ModelAttributes::find()->where(['good_id' => 2])->andWhere(['value' => ['32', 'black']])->all();
Код: Выделить всё
$model = ModelGoods::findOne(2);
$result = $model->getRelationsAttributes()->where(['value' => ['32', 'black']])->all();
не ... ему надо AND ...Dominus писал(а): ↑2017.12.12, 16:00Код: Выделить всё
$result = ModelAttributes::find()->where(['good_id' => 2])->andWhere(['value' => ['32', 'black']])->all();
Код: Выделить всё
$attributes = ModelAttributes::find()->where(['value' => ['32', 'black']])->all();
$goods = [];
foreach($attributes as $attribute) {
$goods[] = ModelGoods::findOne($attribute->good_id);
}
var_dump($goods);
Код: Выделить всё
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()
Код: Выделить всё
// это вариант через запросы, каждый отсеивающий то 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():[];