【问题标题】:Yii2: Non-Scenario fields are not savedYii2:非场景字段不保存
【发布时间】:2016-10-07 12:24:45
【问题描述】:

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

在场景中不需要字段电子邮件,但如果我通过电子邮件,它不会保存在数据库中。

模型中的规则:

 [['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 返回空白邮件

【问题讨论】:

  • 您的“insert2”场景不包括email 属性,因此它当然不会被大量分配。您对此有何惊讶?
  • email 不是 insert2 场景中的必填字段,但如果出现,则应插入。这是我的要求。

标签: yii2


【解决方案1】:

来自Yii 2 load() docs

请注意,正在填充的数据需要通过 setAttributes() 进行安全检查。

现在,setAttributes() 签名:

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

其中$safeOnly 设置为true 意味着只能对安全属性进行分配。安全属性是与当前 $scenario 中的验证规则相关联的属性。

所以email 必须包含在场景中。

【讨论】:

  • 如果我在场景中包含电子邮件,那么电子邮件将是必填字段。
  • 不,它不是那样工作的。仅当为此字段添加了验证规则required 时才需要。
【解决方案2】:

在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 和 status 是必需的,如果您提供任何值,电子邮件将被保存,因为 ['email','safe'] 规则也适用于此。

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

请注意你不能在这里使用public function scenarios() {..

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

【讨论】:

  • 谢谢..我在规则上犯了一个错误并修复了。您的回答有助于解决该问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多