Выборочный update из формы yii2 в базу

71
26 ноября 2021, 02:20

Есть форма. С нее данные отправляются в объект $UserProfile. Далее делаю функцию:

public function actionProfile($UserProfile=null)
{
        $UserProfile = new UserprofileForm();
        if ($UserProfile->load(Yii::$app->request->post())) //отправлен post запрос
        {
            if ($UserProfile->validate()) //данные проходят валидацию
            {
                if ((Yii::$app->user->identity->roles)!=='Admin'){
                    Yii::$app->session->setFlash('warning', 'У вас нет прав редактировать информацию. Доступна только смена пароля.');
                }
                else{
                    Yii::$app->session->setFlash('success', 'Данные записаны');
                    $fios=$UserProfile['fio'];
                    $model = UserprofileForm::find()->where(['id' => 1])->one();
                    $model->fio = $UserProfile['fio'];
                    $model->save();
                }
            }
            else
            {
                Yii::$app->session->setFlash('error', 'Даные не прошли валидацию...');
            }
        }
        $this->view->title = 'Профиль пользователя';
        return $this->render('profile', compact('UserProfile'));
    }

В таком случае, данные в методе save() не сохраняются и не обновляются. А точнее вообще не обрабатываются. Запрос find() проходит, а апдейт нет. Если сделать так:

$connection = Yii::$app->db;
                    $connection->createCommand()->update('user', ['fio' => $UserProfile['fio']], 'id = '.Yii::$app->user->identity->id.'')->execute();
                    return $this->refresh();

Запрос удачно отрабатывает. НО в yii2-отладчике, данный запрос не фиксируется, что не удобно для отладки. А если делать сразу save(), то он пытается обновить все поля, что пришли из формы, но этого мне не нужно. В форму пришло 3 поля, а обновить я хочу 2, например. Вопрос: Почему не отрабатывает запрос с первом случае, и как делать апдейт выборочных стобцов? т.к. названия полей в форме и названия столбцов в БД я делаю разные.

Answer 1

Для сохранения разного количества полей из формы необходимо использовать сценарии. Для каждого сценария описываем необходимые поля, которые надо сохранить. В экшене уже по условию переключаем сценарий у модели. Если в сценарии указано всего два поля, этот сценарий активен и для этих полей есть правила, эти поля будут провалидированы и сохранены.

Вероятно, это условие выгоднее описать в бихевиоре AccessControl

            if ((Yii::$app->user->identity->roles)!=='Admin'){
                Yii::$app->session->setFlash('warning', 'У вас нет прав редактировать информацию. Доступна только смена пароля.');
            }

Если поля формы и модели отличаются, то нет необходимости грузить все данные из запроса в модель Yii::$app->request->post(). Можно создать свой массив данных и по условию включать или исключать третье поле с данными. Тогда и сценарии не нужны. Но это плохая практика, при добавлении нового поля придется править и модель и экшен. А в экшене не должно быть упоминаний о полях модели.

READ ALSO
Слетела кодировка

Слетела кодировка

Всем привет, слетела кодировка, почта была создана на хостинге pskz Помогите плиз

101
Условие для вывода страниц в Wordpress

Условие для вывода страниц в Wordpress

Как сделать условие если нету дочерных страниц выполнить другой запрос $args для того чтобь вывести соседные страницы а не дочерные

181
PHP Warning: Use of undefined constant

PHP Warning: Use of undefined constant

Сервер постоянно логирует вот такую ошибку:

94
Сравнение двух массивов и замена одинаковых значений

Сравнение двух массивов и замена одинаковых значений

Необходимо сравнить 2 массива, и заменить элементы, которые присутствуют во 2-ом нулями

89