发新话题
打印

ThinPHP的关联查询初步

ThinPHP的关联查询初步

因为考虑到效率,之前的关联查询实现是通过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等高级属性。

以上方法仍然处于测试阶段~在新版本正式发布之前有可能作调整。
汇集PHP中文开发资源 - 打造中文PHP第一社群 - PHP开发资源网

TOP

发新话题