游学 2014-08-18 10:59:57 4805次浏览 0条评论 1 0 0

如果是刚接触YII的话你一定还对它的Relational Active Record不是太了解吧,其实它对你联表查询有很大帮助的,能自动帮你完成很多事,可谓是省心省时又省力,下面举例说明下:http://blog.csdn.net/lucifer_qiao/article/details/8744186

在我们正式使用这个方便的关系引用之前,先要去模型中定义relations方法以覆盖父类(AR)中的这个方法,那我们从这个方法开始,在这个方法中其实是返回一个关系型的配置数组,现在我们来举例,假设我们有两个表:

表user   字段  id(pk),user,name
表post    字段 id(pk),title,author_id(fk)

官方示例:''varname"=>array('RelationType', 'ClassName', 'ForeignKey', ...additional options) varname //这个是可以自定义的其实相当关联表的缩写

比如:select * from abc a left join cba c on c.id=a.id 通常yii 中会把当前模型对应的表定义为 t 如果你打印是可以看到的就像这样:select * from abc t left join cba c on c.id=t.id 这个c就是我们的varname,要记住这个一会我们会用到

RelationType   //这个是Yii中定义的几种表间关系,假我们在表A模型中
BELONGS_TO(属于): 表A属于表B ;
HAS_MANY(有多个): 表A 有多个 B ; 
HAS_ONE(有一个)   : 表A 最多有一个 B ;
MANY_MANY: 表A有多个表B,表B同A
ClassName   //模型的名字,比如:/models/Post.php  那么这里就是Post
ForeignKey   //可以是多个,也可以是一个

当然也有意外情况发生比如,你不想关联主键了或是外键了那么你可以不写,那么你可以按这种格式来写On条件
“post"=>array("SELF::HAS_MANY","Post",'',"on"=>"t.id=post.id") 这样条件就更灵活了,你也可以把等于变小于,然后就是其他额外选项了接下来就是通过with()配合我们的查询使用了,假设我们定义了一个关系 ”p"=>array("SELF::HAS_MANY","Post","author_id"),

1,我想找某个人写了哪写文章
User::model()->with("p")->findAllByPk($user_id);
sql执行:select * from user t left outer join post p on p.author_id=t.id where t.id=$user_id;

  1. 因为yii的jointype默认是left outer join,而当我们想利用这个关系进行内连接查询进怎么办,我们可以这样
    User::model()->with(array("p"=>array('joinType' => 'INNER JOIN')))->findAllByPk($user_id);
    sql执行:select * from user t inner join post p on p.author_id=t.id where t.id=$user_id;
  2. 因为mysql不支持全连接这样的形式,现在确需要用全连接的话,我们最好还是选用union来解决
    没有找到数据。
您需要登录后才可以评论。登录 | 立即注册