Yii2:非场景字段未保存

时间:2016-10-07 12:24:46

标签: yii2

我正在使用不同的场景进行验证。

在方案中不需要字段电子邮件,但如果我传递电子邮件,则不会将其保存在数据库中。

模型中的规则:

 [['firstname','email'], 'string', 'max' => 256],

场景功能

 public function scenarios() {
        $scenarios = parent::scenarios();
        $scenarios['insert2'] =  ['firstname', 'status'];
        return $scenarios;
    }

在控制器中:

$model = new User();
$model->scenario = "insert2";
$model->load($data);
print_r($model);

Print_r返回空白

的电子邮件

2 个答案:

答案 0 :(得分:5)

来自Yii 2 load() docs

  

请注意,正在填充的数据受setAttributes()的安全检查。

现在,setAttributes()签名:

public void setAttributes ( $values, $safeOnly = true )

其中$safeOnly设置为true表示只应对安全属性进行分配。安全属性是与当前$方案中的验证规则相关联的属性。

因此情景中必须包含email

答案 1 :(得分:1)

在Yii2中,当您希望在某些方案中应用规则时,您可以指定规则的on属性,如下所示

 public function rules()
    {
        return [

            //rule applied only in scenario 'insert2'
            [['first_name','status'], 'required','on' => 'insert2'],


            //rule applied  in all scenarios 
            ['email','safe'],

            //rule applied only in scenario 'insert3'
            [['first_name','status','email'], 'required','on' => 'insert3'],       
        ];
    }

现在,如果您在控制器中指定$model->scenario = "insert2",那么 first_name和状态是必需的,如果您提供任何值,则会发送电子邮件,因为['email','safe']规则也适用于此处。

如果您在控制器中指定$model->scenario = "insert3",则 first_name,状态和电子邮件现在是必填字段,并且规则['email','safe']也会被应用。

请注意,您不能在此使用public function scenarios() {..

来自http://www.yiiframework.com/doc-2.0/guide-structure-models.html#validation-rules