YII2 Как правильно построить запрос с joinWith?

286
04 января 2019, 10:50

yii2-advanced, суть: получаю $id, нахожу в таблице product_image 'id' => $id, и также надо найти запись из таблицы product, у которой должно быть 'id' => 'product_image->id'. Найти нужно одну запись картинки и одну запись продукта. Как это оформить? Сделал так:

$model = Images::find()
            ->joinWith('products')
            ->where(['id' => $id])
            ->andWhere(['id' => 'product_id'])
            ->one();

но похоже что что-то не так оформил. Думаю можно сделать 2 запроса, но тогда какой смысл от joinWith? Можно обойтись без второго запроса и как это оформить?

2 запроса выглядят так:

        $model = Images::find()->where(['id' => $id])->one();
        $prod = Products::find()->where(['id' => $model->product_id])->one();

Связи products и images:

public function getProducts()
{
    return $this->hasOne(Products::className(), ['id' => 'product_id']);
}
public function getImages()
{
    return $this->hasMany(Images::className(), ['product_id' => 'id']);
}

Сам метод, для которого нужен запрос:

        $model = Images::find()
        ->joinWith('product')
        ->where(['id' => $id])
        ->one();
        if (Yii::$app->user->can('updateFabricatorImages', ['brand_id' => $model->product->brand_id])) {
            Images::isArray($model);
            if ($model->delete()) {
                return $this->redirect(["products/view/?id=$model->product_id"]);
            }
        }
        else {
            throw new ForbiddenHttpException('Вам не разрешено производить данное действие.');
        }
Answer 1
$model = Images::find()
        ->joinWith('product')
        ->where(['product.id' => $id])
        ->asArray()
        ->one();
Answer 2

Раз у Вас hasOne тогда связь лучше назвать getProduct

public function getProduct()
{
    return $this->hasOne(Products::className(), ['id' => 'product_id']);
}

$model = Images::find()
        ->joinWith(['product' => function ($q) {
             $q->from('product');
        }])
        ->where(['id' => $id])
        ->one();
READ ALSO
как записать массив в базу данных

как записать массив в базу данных

Имеется массив вида

247
Распарсить строчку на составляющие

Распарсить строчку на составляющие

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

232
В каких случаях метод ActiveRecord save() возвращает false?

В каких случаях метод ActiveRecord save() возвращает false?

У меня с товарищем возникла дискуссия вот по какому поводу:

209
Помогите составить правильный sql запрос

Помогите составить правильный sql запрос

Порядок нахождения записей в БД построен указным на скриншоте образом

202