可能存在两个活动记录对象之间的关系有四种类型:
- BELONGS_TO: 例如,成员属于一个团队;
- HAS_ONE: 例如,成员有个人资料;
- HAS_MANY: 例如,一个团队有很多成员;
- MANY_MANY: 例如,成员有很多的技巧和技能是属于这个成员的;
除了上述的关系类型,还支持一种特殊的关系称为STAT,可以用来进行统计查询(或聚合查询)。它检索聚合对相关对象的信息,如每个帖子,对于每个产品,平均分数为注释的数目等。
相关对象的每个类定义在此方法中作为具有以下元素的数组:
'varName'=>array('relationType', 'className', 'foreign_key', ...additional options)
其中‘varName’是批变量/属性的名称,可以通过对象来访问; ‘relationType’是指关系的类型,它可以是以下四种常量之一,
self::BELONGS_TO,self::HAS_ONE,self::HAS_MANY 和 self::MANY_MANY;
‘className’是指活动记录类的相关对象的名称;和‘foreign_key’规定的外键涉及两种活动记录。请注意复合外键,
他们可以一起列出,以逗号分隔,或者作为一个数组指定数组的格式(‘key1,key2’)。如果你需要指定自定义的pk->fk关联,你可以定义数组(‘fk’=>
‘pk’)。对于组合键这将是数组(‘fk_c1’=>‘pk_с1’,‘fk_c2’=>‘pk_c2’)。
MANY_MANY关系中使用外键,加入表必须声明为(例如:‘join_table(fk1,fk2)’)。
其余数组元素的名称-值,可以指定其他选项:
-
‘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 可用。
以下是一个例子,为 ‘Post’ 活动记录类相关对象的一个示例:
return array( 'author'=>array(self::BELONGS_TO, 'User', 'author_id'), 'comments'=>array(self::HAS_MANY, 'Comment', 'post_id', 'with'=>'author', 'order'=>'create_time DESC'), 'tags'=>array(self::MANY_MANY, 'Tag', 'post_tag(post_id, tag_id)', 'order'=>'name'), );
哇,这篇文章正在减轻对世界广泛使用的信息材料。 理解博客的最佳方式是你在语法上有一些技巧。 我会把这篇文章推荐给其他人,这样他们也会得到一些好处。
眼镜