以Blog示例: 重点看注释

User类中的relations方法如下

  1. <span style="font-size:18px;background-color: rgb(255, 255, 255);"> public function relations()
  2. {
  3. return array(
  4. 'posts' => array(self::HAS_MANY, 'Post', 'author_id',
  5. 'order'=>'posts.update_time DESC',
  6. 'with'=>'comments:approved',  // $user = User::model()->findByPk(1); 这里也查出了每篇post所带的comments
  7. //approved是comment的命名空间,可以在这里设置
  8. //'together'=>false,  设置这一项,关联查新将被分为几个SQL语句执行,和性能有关系
  9. ),
  10. 'postCount'=>array(
  11. self::STAT,'Post','author_id',
  12. 'condition'=>'status='.Post::STATUS_PUBLISHED,
  13. ),
  14. );
  15. }</span>

Post中的方法如下 :

  1. <span style="font-size:18px;background-color: rgb(255, 255, 255);">public function relations()
  2. {
  3. // NOTE: you may need to adjust the relation name and the related
  4. // class name for the relations automatically generated below.
  5. return array(
  6. 'author'=>array(self::BELONGS_TO,'User','author_id',
  7. //'select'=>'id,username,profile',    // 关联查询的选项,如果不设置,则默认为*即整个关联记录
  8. ),
  9. 'comments'=>array(self::HAS_MANY,'Comment','post_id',
  10. 'condition'=>'comments.status='.Comment::STATUS_APPROVED,
  11. 'order'=>'comments.create_time DESC'),
  12. 'commentCount'=>array(
  13. self::STAT,'Comment','post_id',
  14. 'condition'=>'status='.Comment::STATUS_APPROVED
  15. ),
  16. );
  17. }
  18. </span>

Comment中的ralations方法如下:

  1. <span style="font-size:18px;background-color: rgb(255, 255, 255);">public function attributeLabels()    //名字和现实标签的映射数组
  2. {
  3. return array(
  4. 'id' => 'Id',
  5. 'content' => 'Comment',
  6. 'status' => 'Status',
  7. 'create_time' => 'Create Time',
  8. 'author' => 'Name',
  9. 'email' => 'Email',
  10. 'url' => 'Website',
  11. 'post_id' => 'PostID',   //对应的博客ID
  12. );
  13. }
  14. </span>

在控制器中写个方法测试一下结果:

  1. <span style="font-size:18px;background-color: rgb(255, 255, 255);"> public function actionRQ(){
  2. $post = Post::model()->find('id=:id',array(':id'=>7));
  3. echo $post->author->username;
  4. echo "<hr>";
  5. $posts = Post::model()->with('author','comments')->findAll();   //急切加载
  6. foreach($posts as $post){
  7. echo $post->id."  |";
  8. foreach($post->comments as $comment){
  9. echo $comment->id.": ";
  10. echo $comment->content."<br>";
  11. }
  12. echo $post->author->username."<br>";
  13. }
  14. echo "<hr>";
  15. $user = User::model()->with('posts.comments')->findByPk(1);
  16. //$user = User::model()->findByPk(1);  这一句和上一句是一样的,因为在User的relations声明的posts也已经加上了关联查询:with=>'comments'
  17. foreach($user->posts as $post){    //嵌套急切加载
  18. echo $post->title." (";
  19. foreach($post->comments as $comment){
  20. echo $comment->id." : ";
  21. echo $comment->content."<br>";
  22. }
  23. echo ")".$post->tags."<br>";
  24. }
  25. echo "<hr>";
  26. $criteria = new CDbCriteria;
  27. //$criteria->select = "username";
  28. //$criteria->order
  29. //$criteria->limit
  30. //$criteria->condition
  31. //$criteria->params
  32. $criteria->with = array(
  33. 'posts.comments',
  34. );
  35. $users = User::model()->findAll($criteria);
  36. foreach($users as $user){
  37. echo $user->username.":<br>";
  38. //echo $user->password;
  39. foreach($user->posts as $post){    //嵌套急切加载
  40. echo $post->title." (";
  41. foreach($post->comments as $comment){
  42. echo $comment->id." : ";
  43. echo $comment->content."<br>";
  44. }
  45. echo ")".$post->tags."<br>";
  46. }
  47. }
  48. //动态关联查询,也就是在查询的时候覆盖relations中设置的关联的选项
  49. echo "<hr>";
  50. $user=User::model()->with(array(
  51. 'posts'=>array(
  52. 'order'=>'posts.update_time DESC',
  53. 'with'=>array('comments'=>array('order'=>'comments.id ASC')),
  54. //'together'=>false,   //关联声明中设置together 选项为false 以便一些表被连接在单独的SQL语句中,分为几个SQL语句执行
  55. ),
  56. ))->findByPk(1);
  57. echo "demo 的posts数量为:".$user->postCount;
  58. echo "<br>";
  59. foreach($user->posts as $post){
  60. echo $post->id."(";
  61. echo $post->title."的评论数量是:".$post->commentCount."<br>";
  62. foreach($post->comments as $comment){
  63. echo $comment->id." | ";
  64. }
  65. echo ")";
  66. echo "<br>";
  67. }
  68. }</span>
  69. 原文来自 http://blog.csdn.net/littlebearwmx/article/details/8561018

Yii中的relations方法的更多相关文章

  1. C#中DataTable中的Compute方法使用收集

    原文: C#中DataTable中的Compute方法使用收集 Compute函数的参数就两个:Expression,和Filter. Expresstion是计算表达式,关于Expression的详 ...

  2. Yii中的错误及异常处理

    Yii中的错误及异常处理 Yii已经默认已经在CApplication上实现了异常和错误的接管,这是通过php的set_exception_handler, set_error_handler实现的. ...

  3. Yii中事件触发机制

    控制器初始化中添加事件处理方法,在需要触发的地方直接触发 public function init() { parent::init(); // TODO: Change the autogenera ...

  4. 在yii中使用分页

    yii中使用分页很方便,如下两种方法: 在控制器中: 1. $criteria = new CDbCriteria(); //new cdbcriteria数据库$criteria->id = ...

  5. yii中的自定义组件

    yii中的自定义组件(组件就是一些自定义的公用类) 1.在项目目录中的protected/components/Xxxx.php 2.在Xxxx.php中定义一个类,类名必须与文件名相同 3.控制器中 ...

  6. YII中的表单挂件

    利用助手(widget)在页面实现表单 控制器中 <?php class YiiFormController extends Controller { public function actio ...

  7. Javascript and AJAX with Yii(在yii 中使用 javascript 和ajax)

    英文原文:http://www.yiiframework.com/wiki/394/javascript-and-ajax-with-yii /*** http://www.yiiframework. ...

  8. yii 中设置提示成功信息,错误提示信息,警告信息

    方法一: <?php Yii::app()->user->setFlash(‘success’,”Data saved!”); 设置键值名为success的临时信息.在getFlas ...

  9. 解密yii中CModule::_components和CModule::_componentConfig

    array CModule::_components 所有组件对象(CComponent的子类)将作为键值存在该数组中, 键名是定义该组件时使用的键名.例如: protected function r ...

随机推荐

  1. php根据IP获取所在省份-淘宝api接口

    这里用的file_put_contents,你也可以用别的,直接怼代码: //拼接传递的参数$ip = '175.12.53.12' $opts = array( 'http'=>array( ...

  2. php发送邮件功能(PHPMailer-master插件)

    当作一个插件使用即可,放到网站根目录,然后调用里面的mail.php 源码

  3. 用 Redis Desktop Manager 远程连接 redis 数据库。

    环境: 本机OS:window 10(本机没有安装redis) redis 服务器:centos 7 使用 Redis Desktop Manager 工具远程连接 redis. Redis Desk ...

  4. PHP 字符串常用操作

    1,拼接字符串 拼接字符串是最常用到的字符串操作之一,在PHP中支持三种方式对字符串进行拼接操作,分别是圆点.分隔符{}操作,还有圆点等号.=来进行操作,圆点等号可以把一个比较长的字符串分解为几行进行 ...

  5. JS加法相关

    1:首先JS是一种弱语言,但是同类型可以自己相加减 例如“a”+”b” 可以自动组成ab : 1+ 2 自动变成3 var data = 2; var currentPage = data; //2 ...

  6. Scarpy+selenium 结合使用

    首先要先在spider对象实例化时,同时实例化一个浏览器对象 # -*- coding: utf-8 -*- import scrapy from selenium import webdriver ...

  7. eclipse Java类 红色感叹号 commit失败

    解决方法:  1.进入java类文件所在物理目录 (e:\workspace\myproject\...) 2. 删除多余的版本管理工具的文件或文件夹(如 .svn) 3. 刷新eclipse工程 4 ...

  8. <head>标签和它的小伙伴们

    head标签是HTML文档中最基本的必须元素之一(body:对,还有我): <html> <head> <title>文档的标题</title> < ...

  9. js的函数作用域跟块级作用域

    js的函数作用域跟块级作用域(原文地址:http://blog.csdn.net/huangjq36sysu/article/details/51085674)

  10. Activiti学习之HelloWorld程序

    流程图 部署流程定义 /** * 部署流程定义 */ @Test public void deploymentProcessDefinition() { ProcessEngine processEn ...