Как получить все поля, кроме одного, используя scenarios в Yii2?

263
20 сентября 2017, 13:06

Нужно сделать так, чтобы при получении данных из формы мы писали в базу все полученные данные, кроме одного.
Например, у нас есть в форме 3 поля: f1, f2, f3.
Мы в модели можем написать так:

public function scenarios()
    {
        return [
            'my' => ['f1', 'f2'],
        ];
    }

Все отлично, но если у нас полей не 3, а 30, то переписывать все доступные поля не хочется.
Есть ли способ через сценарии написать, чтобы доступными были все, кроме одного, ну, или кроме нескольких?

Answer 1

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

public function scenarios()
{
    $fields = $this->attributes();
    unset($fields['somefield']);
    return [
        'my' => $fields,
    ];
}

Можно другим путем пойти, очистить поле перед валидацией:

public function beforeValidate(){
    $this->somefield = null;
    return parent::beforeValidate();
}

А можно и просто в контроллере не передавать модели то поле которое не надо:

public function actionSomeAction(){
    $post = Yii::$app->request->post();
    $post['somefield'] = null;
    $model = new Model();
    if($model->load($post)){
        ...
    }
    ...
}

Ну и еще разные пути)

READ ALSO
помогите, почему не работает перевод из 16 в 10 систему

помогите, почему не работает перевод из 16 в 10 систему

при вводе числа AA в 16и ричнной системе выдаёт не 170 а 160

274
Объясните как настроить среду запуска и отладки драйвера [требует правки]

Объясните как настроить среду запуска и отладки драйвера [требует правки]

Объясните, пожалуйста, как настроить среду запуска и отладки драйвера на Windows чтобы target машина была виртуальная, а написание происходило...

211
Как переменную int положить в массив char в С++? [требует правки]

Как переменную int положить в массив char в С++? [требует правки]

Как переменную int положить в массив char в С++

281