ActiveRecord, insert/update

Здравствуйте. Помогите, пожалуйста со следующей проблемой. (Yii2)

Имеется объект OrgModel (ActiveRecord),который привязывается к таблице организаций с 3 полями (id, name, comment). Правила валидации следующие:


    public function rules()

    {

        return [

            ['name', 'required'],

            [['id', 'comment'], 'safe'],

        ];

    }



Далее строится форма и, если, передается id, из базы загружается соответствующая модель и данные вписываются в форму. id записывается как скрытое поле, чтобы потом уйти вместе с post.

Сам post обрабатывается тут:


    public function actionOrgForm()

    {

        $model = new OrgModel;


        if (Yii::$app->request->post('OrgModel'))

        {


            if ($model->load(Yii::$app->request->post()) && $model->validate())

            {

                if ($model->id != 0)

                    $model->update();

                else

                    $model->insert();


                return $this->runAction('org-list');

            }

            else

            {

                echo '!!!'; die();

            }

        }      

        ...

 }



Собственно вопросы:

  1. Правильно ли делаю, что передаю id в форму и возвращаю назад, как скрытое поле? Может есть другие, общепринятые варианты? Правильно ли поступаю с правилами валидации для id?

  2. Собственно сама проблема (из-за чего и прописано тут insert/update) - если форма новая, без id, то все обрабатывается нормально и новая строчка записывается в базу. Если при этом запись была (передается id) и обновляется, то insert выдает ошибку о дублировании ключей. А вот при выборе update, запись не происходит. Сам запрос формируется почему-то такой: “UPDATE org SET name=‘Рога и копыта’, comment=‘Описаниие’, id=1 WHERE id IS NULL”. Первичный ключ в запросе в разделе WHERE не прописывается. Подскажите, пожалуйста, в чем может быть дело? Дамп модели показывает, что свойство (ключ) id в ней есть. Тем более, что insert выдает ошибку. Свойство isNewRecord = false тоже выставлял.

  1. Правильно, нормально

  2. Попробуй заменить

$model->load(Yii::$app->request->post())

на

$model->load(Yii::$app->request->post(‘OrgModel’))

Пробовал. В том-то и дело, что модель загружается и так и так. Дамп модели показывает, что все поля на месте, только id как строка грузится. Даже пробовал в ручную привести id к int, но sql-запрос все равно формируется без указания ключа в WHERE.

На текущий момент вопрос решен небольшим костылем - если в POST передается id, я сначала загружаю модель через $model::findOne($id), после чего делаю $model->load. В этом случае UPDATE работает нормально. Хотя мне кажется, что все должно быть проще и можно обойтись без findOne.

P.S. Единственное различие в моделях между полученной через new, load, и new, findOne, load - заполненный раздел _oldAttributes во втором случае. Возможно дело в этом. Как вариант UPDATE берет id именно из _oldAttributes.

Итак, мой вывод. Копание в исходниках показало, что как и предположил, ActiveRecord::update() берет ключ только из _oldAttributes. А данный раздел заполняется поиском, в моем случае при помощи findOne. Хотя, может, все-таки, есть более нормальные способы это сделать, но пока не нашел.