YII场景

  YII在模型中定义场景后

public function scenarios(){//场景
        return [
            'sco1'=>['aid','uphone'],
            'sco2'=>['aid','uphone','status'],
        ];
    }

  在控制器中调用场景时,场景定义之外的字段会在操作时被过滤掉

public function actionSenorio(){
        $test = new Code();
        $test->scenario = "sco1";
        $testData = [
            'data'=>['aid'=>3,'uphone'=>'015889383625'],
        ];
        $test->load($testData,'data');//在使用load前需要制定场景
        echo $test->aid;//3

        /**
         * 博客系统
         * 写文章时和修改文章时需要保留不同的字段,其他字段会被忽略
        **/
    }

 scenarios() 方法默认实现会返回所有yiiaseModel::rules()方法申明的验证规则中的场景, 当覆盖scenarios()时,如果你想在默认场景外使用新场景,可以编写类似如下代码:

namespace appmodels;

use yiidbActiveRecord;

class User extends ActiveRecord
{
    public function scenarios()
    {
        $scenarios = parent::scenarios();
        $scenarios['login'] = ['username', 'password'];
        $scenarios['register'] = ['username', 'email', 'password'];
        return $scenarios;
    }
}

上面写的可能不是很清晰,我另找了一个 

public function scenarios()
{
    return [
        'create' => ['title', 'image', 'content'],
        'update' => ['title', 'content'],
    ];
}
[['title', 'content'], 'required', 'on' => ['create', 'update']],
[['image'], 'required', 'on' => 'create'],
[['image'], 'image', 'enableClientValidation' => true,   'maxSize' => 1024, 'message' => '您上传的文件过', 'on' => ['create']],
$model = $this->findModel($id);
$model->setScenario('update'); or $model->scenario = 'update';
原文地址:https://www.cnblogs.com/isuben/p/5533659.html