命名空间其实就是设置查询条件,当然也可以用作update,delete的条件了。
要使用命名空间,就在AR类中覆盖方法 scopes 。
废话少说,示例如下:
在Tag类中覆盖scopes :
//命名范围测试 , 命名范围这个函数scopes 应该定义在AR类里面
public function scopes(){
return array(
'newTag'=>array(
'condition'=>'name=:name',
'params'=>array(
':name'=>'newTag',
),
),
'recently'=>array(
'order'=>'id DESC',
'limit'=>4,
),
);
}
然后在一个控制器中测试一下: 这样就能查询到scopes中过滤得到的数据了。
public function actionScopes(){
//命名范围 scopes 测试
$tags = Tag::model()->newTag()->recently()->findAll();
foreach($tags as $tag){
echo $tag->id." ";
echo $tag->name." ";
echo $tag->frequency."<br>";
}
}
Comment中的scopes方法 :
//命名空间,设置查询条件
public function scopes(){
return array(
'approved'=>array(
'condition'=>'t.status='.self::STATUS_APPROVED,
),
'recently'=>array(
'order'=>'t.create_time DESC', // 这里最好指明是主表吧,否则可能会出错
'limit'=>5,
),
);
}
Post类中的scopse方法:
//命名空间的使用。其实就是设置查询条件
public function scopes(){
return array(
'published'=>array(
'condition'=>'status='.self::STATUS_PUBLISHED,
),
'recently'=>array(
'order'=>'update_time DESC',
'limit'=>3,
),
);
}
控制器测试方法:
public function actionScopes(){
echo "<hr>关联查询和命名空间搭配使用<br>";
$posts = Post::model()->recently()->published()->with('comments')->findAll();
foreach($posts as $post){
echo $post->id." |";
foreach($post->comments as $comment){
echo $comment->id.": ";
echo $comment->content."<br>";
}
echo $post->author->username."<br>";
}
echo "<hr>关联查询和命名空间搭配使用<br>";
$posts = Post::model()->with("comments:recently:approved")->findAll();
foreach($posts as $post){
echo $post->id." |";
foreach($post->comments as $comment){
echo $comment->id.": ";
echo $comment->content."<br>";
}
echo $post->author->username."<br>";
}
echo "<hr>";
}
命名空间可以和关联查询联合使用,上面就是这样的例子。