relation的用法
以Blog示例: 重点看注释
User类中的relations方法如下
[php] view plaincopyprint?
<span style="font-size:18px;background-color: rgb(255, 255, 255);"> public function relations()
{
return array(
'posts' => array(self::HAS_MANY, 'Post', 'author_id',
'order'=>'posts.update_time DESC',
'with'=>'comments:approved', // $user = User::model()->findByPk(1); 这里也查出了每篇post所带的comments
//approved是comment的命名空间,可以在这里设置
//'together'=>false, 设置这一项,关联查新将被分为几个SQL语句执行,和性能有关系
),
'postCount'=>array(
self::STAT,'Post','author_id',
'condition'=>'status='.Post::STATUS_PUBLISHED,
),
);
}</span>
Post中的方法如下 :
[php] view plaincopyprint?
<span style="font-size:18px;background-color: rgb(255, 255, 255);">public function relations()
{
// NOTE: you may need to adjust the relation name and the related
// class name for the relations automatically generated below.
return array(
'author'=>array(self::BELONGS_TO,'User','author_id',
//'select'=>'id,username,profile', // 关联查询的选项,如果不设置,则默认为*即整个关联记录
),
'comments'=>array(self::HAS_MANY,'Comment','post_id',
'condition'=>'comments.status='.Comment::STATUS_APPROVED,
'order'=>'comments.create_time DESC'),
'commentCount'=>array(
self::STAT,'Comment','post_id',
'condition'=>'status='.Comment::STATUS_APPROVED
),
);
}
</span>
Comment中的ralations方法如下:
[php] view plaincopyprint?
<span style="font-size:18px;background-color: rgb(255, 255, 255);">public function attributeLabels() //名字和现实标签的映射数组
{
return array(
'id' => 'Id',
'content' => 'Comment',
'status' => 'Status',
'create_time' => 'Create Time',
'author' => 'Name',
'email' => 'Email',
'url' => 'Website',
'post_id' => 'PostID', //对应的博客ID
);
}
</span>
在控制器中写个方法测试一下结果:
[php] view plaincopyprint?
<span style="font-size:18px;background-color: rgb(255, 255, 255);"> public function actionRQ(){
$post = Post::model()->find('id=:id',array(':id'=>7));
echo $post->author->username;
echo "<hr>";
$posts = Post::model()->with('author','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>";
$user = User::model()->with('posts.comments')->findByPk(1);
//$user = User::model()->findByPk(1); 这一句和上一句是一样的,因为在User的relations声明的posts也已经加上了关联查询:with=>'comments'
foreach($user->posts as $post){ //嵌套急切加载
echo $post->title." (";
foreach($post->comments as $comment){
echo $comment->id." : ";
echo $comment->content."<br>";
}
echo ")".$post->tags."<br>";
}
echo "<hr>";
$criteria = new CDbCriteria;
//$criteria->select = "username";
//$criteria->order
//$criteria->limit
//$criteria->condition
//$criteria->params
$criteria->with = array(
'posts.comments',
);
$users = User::model()->findAll($criteria);
foreach($users as $user){
echo $user->username.":<br>";
//echo $user->password;
foreach($user->posts as $post){ //嵌套急切加载
echo $post->title." (";
foreach($post->comments as $comment){
echo $comment->id." : ";
echo $comment->content."<br>";
}
echo ")".$post->tags."<br>";
}
}
//动态关联查询,也就是在查询的时候覆盖relations中设置的关联的选项
echo "<hr>";
$user=User::model()->with(array(
'posts'=>array(
'order'=>'posts.update_time DESC',
'with'=>array('comments'=>array('order'=>'comments.id ASC')),
//'together'=>false, //关联声明中设置together 选项为false 以便一些表被连接在单独的SQL语句中,分为几个SQL语句执行
),
))->findByPk(1);
echo "demo 的posts数量为:".$user->postCount;
echo "<br>";
foreach($user->posts as $post){
echo $post->id."(";
echo $post->title."的评论数量是:".$post->commentCount."<br>";
foreach($post->comments as $comment){
echo $comment->id." | ";
}
echo ")";
echo "<br>";
}
}</span>