Yii2:不保存非场景字段
我使用不同的场景进行验证 场景中不需要字段电子邮件,但如果我传递电子邮件,则不会将其保存在DB中 模型中的规则:Yii2:不保存非场景字段,yii2,Yii2,我使用不同的场景进行验证 场景中不需要字段电子邮件,但如果我传递电子邮件,则不会将其保存在DB中 模型中的规则: [['firstname','email'], 'string', 'max' => 256], 情景功能 public function scenarios() { $scenarios = parent::scenarios(); $scenarios['insert2'] = ['firstname', 'status'];
[['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从以下地址返回空的电子邮件:
请注意,正在填充的数据由setAttributes()进行安全检查
现在,签名:
public void setAttributes ( $values, $safeOnly = true )
其中$safeOnly
设置为true
意味着只能对安全属性进行赋值。安全属性是与当前$scenario中的验证规则关联的属性
因此,方案中必须包含电子邮件。在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”
,则需要名字和状态,如果您给出任何值,电子邮件将被保存,因为['email','safe']
规则也适用于此处
如果您在控制器中指定$model->scenario=“insert3”
,则名字、状态和电子邮件现在是必填字段,规则['email','safe']
也将应用
请注意,您不能在此处使用public function scenarios(){..
从您的“插入2”方案不包括
email
属性,因此当然不会大量分配。您对此有何惊讶?在insert2方案中,email不是必填字段,但如果它出现,则应该插入。这是我的要求。如果我在方案中包括email,则email将是必填字段。不,它不像e.只有在为该字段添加了验证规则required
时才需要。谢谢..我在规则中犯了一个错误并已修复。您的回答有助于修复该问题。