Update & Insert

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

Update & Insert

Сообщение pr22m »

Здравствуйте. Помогите, пожалуйста со следующей проблемой.
Имеется объект OrgModel,который пока привязывается к таблице организаций с 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 в форму и возвращаю назад, как скрытое поле? Может есть другие, общепринятые варианты?
2. Собственно сама проблема (из-за чего и прописано тут insert/update) - если форма новая, без id, то все обрабатывается нормально и новая строчка записывается в базу. Если при этом запись была и обновляется, insert выдает ошибку о дублировании ключей. А вот при выборе update, запись не происходит. Сам запрос формируется почему-то такой: "UPDATE `org` SET `name`='Рога и копыта', `comment`='Описаниие', `id`=1 WHERE `id` IS NULL". Первичный ключ в запросе не прописывается. Подскажите, пожалуйста, в чем может быть дело? Дамп модели показывает, что свойство (ключ) id в ней есть. Тем более, что insert выдает ошибку. Свойство isNewRecord = false тоже выставлял.
mkramer
Сообщения: 531
Зарегистрирован: 2014.12.14, 13:02

Re: Update & Insert

Сообщение mkramer »

Ну обычно это твоя забота - сначала загрузить форму из базы данных. ID прописывать как safe незачем. То, что он в скрытом поле - нормальная практика, хотя я обычно делаю в параметре. Но сделай ему нормальное имя. И тогда в action:

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

$model = isset($_POST["id"]) ? OrgModel::findOne($_POST["id"]): new OrgModel;
if ($model->load(Yii::$app->request->post()) && $model->save()) { /* Уряяя!!! Всё получилось!!! */ Ъ
Ну это мой подход
pr22m
Сообщения: 2
Зарегистрирован: 2017.05.22, 20:59

Re: Update & Insert

Сообщение pr22m »

Так если у меня есть все данные - поля и id в том числе, которые получаю из формы, то поиск findOne - это просто "лишний запрос". Пока остановился на таком-же варианте - загрузка перед сохранением. Спасибо за ответ.
Ответить