关于模型中的几个概念或知识点
模型中的属性可以像普通对象属性一样被访问$model->attribute;也可以以数组元素方式访问$model[attribute]。
属性标签
获取属性标签
$model = new \app\models\ContactForm;
// 显示为 "Name"
echo $model->getAttributeLabel('name');
场景
给模型设置场景,有两种方式
// 场景作为属性来设置
$model = new User;
$model->scenario = 'login';
// 场景通过构造初始化配置来设置
$model = new User(['scenario' => 'login']);
可以给模型设置多个场景,如下图:给User模型设置了登陆和注册两个应用场景
有时你想一条规则只在某个 场景 下应用,为此你可以指定规则的 on
属性,如下所示:
public function rules()
{
return [
// 在"register" 场景下 username, email 和 password 必须有值
[['username', 'email', 'password'], 'required', 'on' => 'register'],
// 在 "login" 场景下 username 和 password 必须有值
[['username', 'password'], 'required', 'on' => 'login'],
];
}
块赋值
$model = new \app\models\ContactForm;
$model->attributes = \Yii::$app->request->post('ContactForm');
或在控制器中这样写
$model = new ContactForm();
$model->load(Yii::$app->request->post();
安全属性
在场景中列出的属性就是安全属性,只有安全属性才能被块赋值。
非安全属性
[[yii\base\Model::scenarios()]] 方法提供两个用处:定义哪些属性应被验证,定义哪些属性安全。 在某些情况下,你可能想验证一个属性但不想让他是安全的,可在scenarios()方法中属性名加一个惊叹号 !。 例如像如下的secret属性。
public function scenarios()
{
return [
'login' => ['username', 'password', '!secret'],
];
}
当模型在 login
场景下,三个属性都会被验证,但只有 username
和 password
属性会被块赋值, 要对secret
属性赋值,必须像如下例子明确对它赋值。
$model->secret = $secret;
属性验证rules方法
public function rules()
{
return [
[['title', 'description'], 'safe'], //这两个属性不需要验证,在验证时候会被过滤
];
}
数据导出
模型通常要导出成不同格式,你可能想将模型的一个集合转成JSON或Excel格式, 导出过程可分解为两个步骤,第一步,模型转换成数组;第二步,数组转换成所需要的格式。 你只需要关注第一步,因为第二步可被通用的数据转换器如[[yii\web\JsonResponseFormatter]]来完成。
将模型转换为数组最简单的方式attributes属性$arr = $model->attributes
更灵活强大的方式是通过toArray()方法,它是实现 RESTful风格的方式。 $model->toArray()