Yii的relations()方法 join查询

2014-8-30 liyangweb.com 李杨 PHP

可能存在两个活动记录对象之间的关系有四种类型:

  • 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'),
);

标签: Yii relations

评论:

James
2018-09-06 22:19
眼镜
haoessays
2018-03-24 20:09
哇,这篇文章正在减轻对世界广泛使用的信息材料。 理解博客的最佳方式是你在语法上有一些技巧。 我会把这篇文章推荐给其他人,这样他们也会得到一些好处。
arham
2018-03-24 19:55
眼镜

发表评论:

Powered by emlog 冀ICP备13011830号-1