updateAll(), почему работает?

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
slo_nik
Сообщения: 344
Зарегистрирован: 2013.10.07, 19:08

updateAll(), почему работает?

Сообщение slo_nik »

Добрый день.
Объясните, пожалуйста, почему работает код.
Есть действие в контролере, которое обновляет статус у связанных моделей по цепочке.
Обновить статус надо у марки автомобиля, модели, поколении, серии, модификации и характеристик.
Марка связана с моделью через $id_mark, поколении, серии, модификации связаны через $id_model.
Связь для марки и модели обычная

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

    public function getModels()
    {
        return $this->hasMany(CarModel::class, ['id_car_mark' => 'id_car_mark']);
    }

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

    public function actionUpdateStatusMark()
    {
        $id = Yii::$app->request->post('id');
        $model = CarMark::find()
                          ->select(['{{%car_mark}}.id_car_mark','{{%car_mark}}.status'])
                          ->joinWith('models.modification', false)
                          ->where('{{%car_mark}}.id_car_mark=:id', [':id' => $id])
                          ->one();
        $model->status = $model->status == 0 ? 1 : 0;
        // этот участок будет вынесен в отдельный метод, пока оставил здесь для удобства.
        $arr = [];
        foreach($model->models as $key => $value){
           $arr = array_merge($arr, $value->updModification);
        };
        $model->save(false,['status']);
        CarModel::updateAll(['status' => $model->status], 'id_car_mark=:id', [':id' => $model->id_car_mark]);
        CarGeneration::updateAll(['status' => $model->status], ['in', 'id_car_model', $model->models]);
        CarSerie::updateAll(['status' => $model->status], ['in', 'id_car_model', $model->models]);
        CarModification::updateAll(['status' => $model->status], ['in', 'id_car_model', $model->models]);
        CarCharacteristicValue::updateAll(['status' => $model->status], ['in', 'id_car_modification', $arr]);
        return $model->status;
    }
В этой строке всё понятно, обновляем статус моделей у которых id_car_mark равен $model->id_car_mark

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

 CarModel::updateAll(['status' => $model->status], 'id_car_mark=:id', [':id' => $model->id_car_mark]);
А вот в подобных строчках мне не совсем понятно, почему срабатывает обновление?

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

CarGeneration::updateAll(['status' => $model->status], ['in', 'id_car_model', $model->models]);
Понимаю так: обновить все поколения моделей у которых $id_car_model равен одному из значений в $model->models.
Но у меня в $model->models не массив id моделей, а объект и по идее должно выдавать ошибку.

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

Array
(
    [0] => backend\models\CarModel Object
        (
            [_attributes:yii\db\BaseActiveRecord:private] => Array
                (
                    [id_car_model] => 1
                    [id_car_mark] => 1
                    [name] => 378 GT Zagato
                    [name_rus] => 378 ГТ Загато
                    [date_create] => 1398979509
                    [date_update] => 1538517167
                    [id_car_type] => 1
                    [status] => 0
                )
     // остальные данные           
Как из этого объекта выделяется именно id_car_model?
Аватара пользователя
Alexum
Сообщения: 683
Зарегистрирован: 2016.09.26, 10:00

Re: updateAll(), почему работает?

Сообщение Alexum »

Если для "IN" передаётся в качестве параметра массив объектов, в которых есть реализация интерфейса ArrayAccess (логично, что ActiveRecord это умеет), то Yii пытается найти подходящее значение (в вашем случае ищет id_car_model). Реализацию смотрите в классе yii\db\conditions\InConditionBuilder.
slo_nik
Сообщения: 344
Зарегистрирован: 2013.10.07, 19:08

Re: updateAll(), почему работает?

Сообщение slo_nik »

Alexum писал(а): 2018.10.22, 09:57 Если для "IN" передаётся в качестве параметра массив объектов, в которых есть реализация интерфейса ArrayAccess (логично, что ActiveRecord это умеет), то Yii пытается найти подходящее значение (в вашем случае ищет id_car_model). Реализацию смотрите в классе yii\db\conditions\InConditionBuilder.
Благодарю, обязательно посмотрю.
Ответить