首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >定义多个场景,并在Yii 2模型中验证多个场景

定义多个场景,并在Yii 2模型中验证多个场景
EN

Stack Overflow用户
提问于 2019-11-23 20:48:41
回答 3查看 677关注 0票数 0

在模型中,我定义了多个场景:

代码语言:javascript
复制
public function rules() {
    return [
        [['in_quantity'], 'required','on'=>['stockIn']],
        [['out_quantity'], 'required','on'=>['stockOut']],
    ];
}

是否可以同时使用scenario stockInstockOut进行单一模型验证?

代码语言:javascript
复制
$StockModel->scenario[] = 'stockOut';
$StockModel->scenario[] = 'stockIn';

代码语言:javascript
复制
 $StockModel->scenario = ['stockOut','stockIn'];
EN

回答 3

Stack Overflow用户

发布于 2019-11-24 04:44:27

模型不能有多个场景。但规则可以有多个场景:

代码语言:javascript
复制
public function rules() {
    return [
        [['in_quantity'], 'required', 'on' => ['stockIn', 'stockOut']],
        [['out_quantity'], 'required', 'on' => ['stockIn', 'stockOut']],
    ];
}

如果模型需要多个场景,这意味着您过度使用了场景功能。

还请注意,不建议在一个模型中使用太多的场景-场景适用于简单的情况,但对于每个场景,更复杂的情况应该由单独的模型处理。

票数 0
EN

Stack Overflow用户

发布于 2019-11-26 19:46:05

如果您使用when扩展规则以进行服务器验证,则可以:

代码语言:javascript
复制
 [
   ['in_quantity'], 
   'required', 
   'when' => function ($model) {
                    return $model->scenario === 'stockIn' || $model->scenario === 'stockOut';
             }
  ]

此外,如果您想在表单中进行验证(也称为客户端验证),您还可以使用期望js函数的whenClient

代码语言:javascript
复制
'whenClient' => "function (attribute, value) {
                    const scenario = $('#stock-scenario').val()
                    return scenario === 'stockIn' || scenario = 'stockOut';
                }"
票数 0
EN

Stack Overflow用户

发布于 2020-03-16 05:15:40

您可以通过这种方式在模型中创建多个场景

代码语言:javascript
复制
class MyModel extends \yii\db\ActiveRecord {
const SCENARIO_CREATE = 'scenario_create';
const SCENARIO_UPDATE = 'scenario_update';


// get scenarios
public function scenarios()
{
     return [
      self::SCENARIO_CREATE      =>  ['user_id', 'name', 'desc', 'published','date_create'],
      self::SCENARIO_UPDATE      =>  ['user_id', 'name', 'desc', 'date_update'],
  ];
}


  public function rules()
  {
          [['user_id'], 'integer'],
          [['name','desc'], 'string', 'max' => 70],
          [['date_create', 'date_update'], 'date', 'format' => 'php:Y-m-d H:i:s'],
      ];
  }
}

你可以在任何地方使用这种方式

代码语言:javascript
复制
public function actionIndex() {
   $model = new MyModel;
   $model->scenario = MyModel::SCENARIO_CREATE;

   if ($model->load(\Yii::$app->request->post())){

      if($model->save()){
        // some operations
      } 
   }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59007798

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档