Yii Framework Forum: ActiveRecord, insert/update - Yii Framework Forum

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

ActiveRecord, insert/update Rate Topic: -----

#1 User is offline   pr22m 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 3
  • Joined: 22-May 17

Posted 22 May 2017 - 01:24 PM

Здравствуйте. Помогите, пожалуйста со следующей проблемой. (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 тоже выставлял.
0

#2 User is offline   a-vav 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 8
  • Joined: 12-January 15

Posted 23 May 2017 - 04:16 AM

1. Правильно, нормально
2. Попробуй заменить
$model->load(Yii::$app->request->post())
на
$model->load(Yii::$app->request->post('OrgModel'))
0

#3 User is offline   pr22m 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 3
  • Joined: 22-May 17

Posted 23 May 2017 - 06:34 AM

View Posta-vav, on 23 May 2017 - 04:16 AM, said:

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.
0

#4 User is offline   pr22m 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 3
  • Joined: 22-May 17

Posted 23 May 2017 - 07:19 AM

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

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users