关于模型中的几个概念或知识点

模型中的属性可以像普通对象属性一样被访问$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()

posted @ 2015-04-11 18:03  向着太阳生  阅读(243)  评论(0编辑  收藏  举报