yii的relations方法的使用

通过在 relations() 中声明这些相关对象,我们就可以利用强大的 Relational ActiveRecord (RAR) 功能来访问资讯的相关对象,例如它的作者和评论。不需要自己写复杂的 SQL JOIN 语句。



  • 前提条件

在组织数据库时,需要使用主键与外键约束才能使用ActiveReocrd的关系操作;

  • 场景

申明关系

两张表之间的关系无非三种:一对多;一对一;多对多; 在AR中,定义了四种关系:

关系 定义 例子
BELONGS_TOA和B的关系是一对多,那么B属于APost属于User
HAS_MANYA和B之间的关系是一对多,那么A有多个BUser有多个Post
HAS_ONE这是HAS_MANY的一种特殊情况,A至多有一个BUser至多有一个Profile
MANY_MANY这个对应多对多的情况,在AR里会将多对多以BELONGS_TO和HAS_MANY的组合来解释Post和Category

在AR中通过重写CActiveRecord类的relations()方法来申明关系;这个方法返回一个关系配置的数组;一个数组无素代表一个单独的关系,格式如下:

'VarName'=>array('RelationType','ClassName','ForeignKey', ...additional options)

Var Name关系名
Relation Type四种关系:self::BELONGS_TO, self::HAS_ONE, self::HAS_MANY, self::MANY_MANY
Class Name代表当前AR类要关联的那个AR类名
Foreign Key实现关系的外键, 有可能有多个,即列名

  • 'select': string|array, 被选中的列列表。默认值为 '*',这意味着是所有列。 如果它们出现在一个表达式中(例如: COUNT(relationName.name) AS name_count)。
  • 'condition': string, WHERE子句。 默认值为空。 注意,列引用需要加入'relationName'前缀 。(例如:relationName.age>20)
  • 'order': string, ORDER BY子句。 默认值为空。 注意,列引用需要加入'relationName'前缀 。(例如:relationName.age DESC)
  • 'with': string|array, 应该与这个对象一起装载的子对象相关名单。 注意,这仅仅是延迟加载,而不是预先加载。
  • 'joinType': 联接类型。 默认值为‘LEFT OUTER JOIN’。
  • 'alias': 关系与关联表的别名。 它默认为null, 意味着表的别名与关系名称相同。
  • 'params': 参数绑定到要生成的SQL语句上。 这应作为名称-值的数组。
  • 'on': ON 子句。 此处指定的条件将追加到使用 AND 运算符的联接条件。
  • 'index': 其值应作为存储相关的对象的数组的键的列的名称。 此选项仅适用于, HAS_MANY 和 MANY_MANY 关系。
  • 'scopes': 应用范围。在单一的范围情况下可以像'scopes'=>'scopeName', 在多个作用域范围情况下可以使用数组像这样'scopes'=>array('scopeName1','scopeName2')。 此选项自版本 1.1.9 可用。

延迟加载时有一定的关系,下列选项可用:
  • 'group': string, GROUP BY子句。 默认值为空。 注意,列引用需要加入'relationName'前缀 。(例如: relationName.age)。此选项仅适用于HAS_MANY 和 MANY_MANY 关系。
  • 'having': string, HAVING子句。 默认值为空。 注意,列引用需要加入'relationName'前缀 。(例如: relationName.age)。此选项仅适用于HAS_MANY 和 MANY_MANY 关系。
  • 'limit': 数据行的limit选择。 这个选项不能应用到BELONGS_TO。
  • 'offset': 数据行的偏移量。 这个选项不能应用到BELONGS_TO。
  • 'through': 获取相关的数据时将用作桥的模型的关系的名称。可以设置仅为 HAS_ONE 和 HAS_MANY。此选项自版本 1.1.7 可用。




方法如下

return array(
'reply' => array(self::BELONGS_TO, 'BookPostReply', 'postid'),//连接BookPostReply表
);
self::BELONGS_TO默认是用当前指定的键跟关联表的主键进行join

默认生成的sql是 on id = postid,id是BookPostReply的主键。


需要生成 on BookPostReply.postid = t.postid,不去关联主键,而且关联其中一个字段的值

return array(
'reply' => array(self::BELONGS_TO, 'BookPostReply', '', 'on' => 't.postid=reply.postid'),
);

关联中的东西也可以有order

'imgs'=>array(self::HAS_MANY,"LightProImgs","pid","order"=>"imgs.paixu desc","limit"=>3)


 

 

使用方法:

面介绍是一种“急切导入”方法:在使用find和findAll时,使用with()方法,例:

$posts=Post::model()->with('author')->findAll()  
$posts=Post::model()->with('author')->findAll()


 

 
 
 
这样就可以在一次查询时连同查询其他信息了;with方法可以接受多个关系:
$posts=Post::model()->with('author','categories')->findAll();  
$posts=Post::model()->with('author','categories')->findAll();

 
 
这样就可以将作者和类别的信息一并进行查询;同样,with还支持多重急切导入
$posts=Post::model()->with( 'author.profile', 'author.posts', 'categories')->findAll();



 


 
 

 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Morven

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值