Yii2 在Yii 2模型中定义多个场景并使用多个场景进行验证

Yii2 在Yii 2模型中定义多个场景并使用多个场景进行验证,yii2,yii2-advanced-app,yii2-model,yii2-validation,Yii2,Yii2 Advanced App,Yii2 Model,Yii2 Validation,在模型中,我定义了多个场景: public function rules() { return [ [['in_quantity'], 'required','on'=>['stockIn']], [['out_quantity'], 'required','on'=>['stockOut']], ]; } 是否可以同时使用场景stockIn和stockOut进行单一模型验证 $StockModel->scenario[] =

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

public function rules() {
    return [
        [['in_quantity'], 'required','on'=>['stockIn']],
        [['out_quantity'], 'required','on'=>['stockOut']],
    ];
}
是否可以同时使用场景
stockIn
stockOut
进行单一模型验证

$StockModel->scenario[] = 'stockOut';
$StockModel->scenario[] = 'stockIn';


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

public function rules() {
    return [
        [['in_quantity'], 'required', 'on' => ['stockIn', 'stockOut']],
        [['out_quantity'], 'required', 'on' => ['stockIn', 'stockOut']],
    ];
}
若模型需要多个场景,这意味着您过度使用了场景功能


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

如果在服务器验证时使用
扩展规则,则可以:

 [
   ['in_quantity'], 
   'required', 
   'when' => function ($model) {
                    return $model->scenario === 'stockIn' || $model->scenario === 'stockOut';
             }
  ]
此外,如果您希望在表单中进行验证(也称为客户端验证),您还可以使用预期js函数的
whenClient

'whenClient' => "function (attribute, value) {
                    const scenario = $('#stock-scenario').val()
                    return scenario === 'stockIn' || scenario = 'stockOut';
                }"

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

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'],
      ];
  }
}
你可以在任何地方用这种方法

public function actionIndex() {
   $model = new MyModel;
   $model->scenario = MyModel::SCENARIO_CREATE;

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

      if($model->save()){
        // some operations
      } 
   }
}

但我想在单个模型中初始化多个场景以进行验证。这仅适用于一次初始化的单个场景time@ShringirajDewangan一个模型一次只能有一个场景。您正在错误使用场景,它们不是为此而设计的,您需要创建一个新的模型。这就是问题所在-您不能在模型中同时有多个场景。即使您调整模型以允许多个场景,它也只是一个坏模式(模型不再控制验证)。
public function actionIndex() {
   $model = new MyModel;
   $model->scenario = MyModel::SCENARIO_CREATE;

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

      if($model->save()){
        // some operations
      } 
   }
}