欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  php教程

Yii framwork crud 命名范围NAMED SCOPE

程序员文章站 2024-02-11 10:57:46
...
命名范围
Note: 对命名范围的支持从版本 1.0.5 开始。 命名范围的最初想法来源于 Ruby on Rails.
命名范围(named scope) 表示一个 命名的(named)查询规则,它可以和其他命名范围联合使用并应用于 Active Record 查询
命名范围主要是在 CActiveRecord::scopes() 方法中以名字-规则对的方式声明。如下代码在 Post 模型类中声明了两个命名范围,
published 和 recently。
class Post extends CActiveRecord
{
......
public function scopes()
{
return array(
'published'=>array(
'condition'=>'status=1',
),
'recently'=>array(
'order'=>'create_time DESC',
'limit'=>5,
),
);
}
}
具体使用: $posts=Post::model()->published()->recently()->findAll();
注意: 命名范围只能用于类级别方法。也就是说,此方法必须使用 ClassName::model() 调用。

参数化的命名范围
命名范围可以参数化。例如, 我们想自定义 recently 命名范围中指定的帖子数量,要实现此目的,不是在CActiveRecord::scopes
方法中声明命名范围, 而是需要定义一个名字和此命名范围的名字相同的方法:
public function recently($limit=5)
{
$this->getDbCriteria()->mergeWith(array(
'order'=>'create_time DESC',
'limit'=>$limit,
));
return $this;
}
然后,我们就可以使用如下语句获取3条最近发布的帖子。
$posts=Post::model()->published()->recently(3)->findAll();//上面的代码中,默认获取 5 条最近发布的帖子。

默认范围
模型类可以有一个默认范围,它将应用于所有 (包括相关的那些) 关于此模型的查询。例如,一个支持多种语言的网站可能只想显
示当前用户所指定的语言的内容。 因为可能会有很多关于此网站内容的查询, 我们可以定义一个默认范围以解决此问题。 为实
现此目的,我们覆盖 CActiveRecord::defaultScope 方法如下:
class Content extends CActiveRecord
{
public function defaultScope()
{
return array(
'condition'=>"language='".Yii::app()->language."'",
);
}
}

现在,如果下面的方法被调用,将会自动使用上面定义的查询规则:$contents=Content::model()->findAll();


实际应用
上面的是几个官方给出的例子,下面是我自己使用的例子供大家参考一下:

TABLE:
school:id(pk,int),name(varchar) //学校
class:id(pk,int),name(varchar),s_id(fk,int) //班级
student:id(pk,int),name(varchar),s_id(int),c_id(int) //学生

例子:查询为学校为“a"的,所有班级,这时我们可以先在School模型中的relations方法中定义一个关系方便调用
public function relations()
{
return array(
'class'=>array(self::HAS_MANY, 'Class', 's_id'),
);
}
public function scopes()
{
return array(
'getAllClass'=>array(
'with'=>'class',
),
};
}
public function getAllClass($name)
{
$this->getDbCriteria()->mergeWith(array(
'condition'=>"t.name=$name",
));
return $this;

}

使用:School::model()->getAllClass("a")->findAll();