官网原文:http://www.yiiframework.com/doc/guide/1.1/zh_cn/database.arr
官网中后半段为英文,而且中文的内容比英文少一些,先放到这里,之后有时间再翻译。
我们已经了解了怎样使用 Active Record (AR) 从单个数据表中获取数据。 在本节中,我们讲解怎样使用 AR 连接多个相关数据表并取回关联(join)后的数据集。
为了使用关系型 AR,我们建议在需要关联的表中定义主键-外键约束。这些约束可以帮助保证相关数据的一致性和完整性。
为简单起见,我们使用如下所示的实体-关系(ER)图中的数据结构演示此节中的例子。
信息: 对外键约束的支持在不同的 DBMS 中是不一样的。 SQLite < 3.6.19 不支持外键约束,但你依然可以在建表时声明约束。
在我们使用 AR 执行关联查询之前,我们需要让 AR 知道一个 AR 类是怎样关联到另一个的。
两个 AR 类之间的关系直接通过 AR 类所代表的数据表之间的关系相关联。 从数据库的角度来说,表 A 和 B 之间有三种关系:一对多(one-to-many,例如 tbl_user
和 tbl_post
),一对一( one-to-one 例如 tbl_user
和tbl_profile
)和 多对多(many-to-many 例如 tbl_category
和 tbl_post
)。 在 AR 中,有四种关系:
BELONGS_TO
(属于): 如果表 A 和 B 之间的关系是一对多,则 表 B 属于 表 A (例如 Post
属于 User
);
HAS_MANY
(有多个): 如果表 A 和 B 之间的关系是一对多,则 A 有多个 B (例如 User
有多个 Post
);
HAS_ONE
(有一个): 这是 HAS_MANY
的一个特例,A 最多有一个 B (例如 User
最多有一个 Profile
);
MANY_MANY
: 这个对应于数据库中的 多对多 关系。 由于多数 DBMS 不直接支持 多对多 关系,因此需要有一个关联表将 多对多 关系分割为 一对多 关系。 在我们的示例数据结构中,tbl_post_category
就是用于此目的的。在 AR 术语中,我们可以解释 MANY_MANY
为 BELONGS_TO
和 HAS_MANY
的组合。 例如,Post
属于多个(belongs to many) Category
,Category
有多个(has many) Post
.
AR 中定义关系需要覆盖 CActiveRecord 中的 relations() 方法。此方法返回一个关系配置数组。每个数组元素通过如下格式表示一个单一的关系。
'VarName'=>array('RelationType', 'ClassName', 'ForeignKey', ...additional options)