因为考虑到效率,之前的关联查询实现是通过
sql实现,但这毕竟不符合ORM对于表映射的要求。为了更加方便地读取关联数据,最近尝试添加了关联查询方法。
目前支持的表间关联方式包括三种:
1、ONE_TO_ONE ( 包括HAS_ONE 和 BELONGS_TO )
2、ONE_TO_MANY( 包括HAS_MANY 和 BELONGS_TO)
3、MANY_TO_MANY
Dao类增加了一个autoLink属性,来设置是否需要自动获取关联记录。如果设置为True,则find()方法会自动获取关联所有的记录。不管是否autoLink,都可以使用xfind() 方法用于直接获取带关联记录的返回结果,而 getRelation() 方法用于获取已经返回记录的关联记录(集)。
使用xfind()和getRelation()方法可以指定要连接的关联记录和类型。
关联查询需要Vo类定义_link 属性配合,例如UserVo中
定义如下关联信息:
- var $_link = array(
-
// 每个用户都有一个个人档案-
array( 'mapping_type'=>HAS_ONE,-
'class_name'=>'Profile',-
'foreign_key'=>'userId',-
'mapping_name'=>'profile',- ),
-
// 每个用户有多个文章-
array( 'mapping_type'=>HAS_MANY,-
'class_name'=>'Article',-
'foreign_key'=>'userId',-
'mapping_name'=>'articles',-
'mapping_order'=>'cTime desc'),-
// 每个用户都属于一个部门-
array( 'mapping_type'=>BELONGS_TO,-
'class_name'=>'Dept',-
'foreign_key'=>'userId',-
'mapping_name'=>'dept'),-
// 每个用户可以属于多个组,每个组可以有多个用户-
array( 'mapping_type'=>MANY_TO_MANY,-
'class_name'=>'Group',-
'mapping_name'=>'groups',-
'foreign_key'=>'userId',-
'relation_foreign_key'=>'goupId',-
'relation_table'=>'think_gourpUser')- );
关于映射关系的定义,还有一些高级默认规则,除了mapping_type、class_name 和mapping_name 三个属性必须外,其他都是可选的。另外,还可以包括mapping_order、condition、mapping_limit等高级属性。
以上方法仍然处于测试阶段~在新版本正式发布之前有可能作调整。