Chinaunix首页 | 论坛 | 博客
  • 博客访问: 544475
  • 博文数量: 252
  • 博客积分: 6057
  • 博客等级: 准将
  • 技术积分: 1635
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-21 10:17
文章分类

全部博文(252)

文章存档

2013年(1)

2012年(1)

2011年(32)

2010年(212)

2009年(6)

分类: C/C++

2010-06-13 09:22:38

ThinkPHP可以很轻松的完成数据表的关联CURD操 作,目前支持的关联关系包括下面四种:HAS_ONE、BELONGS_TO、HAS_MANY、MANY_TO_MANY。

一个模型根据业务模型的复杂程度可以同时定义多个关联,不受限制,所有的关联定义都统一在模型类的 $_link 成员变量里面定义,并且可以支持动态定义。关联定义的格式是:

protected $_link = array(

    '关联1'  =>  array(

        '关联属性1' => '定义',

        '关联属性N' => '定义',

    ),

    '关联2'  =>  array(

        '关联属性1' => '定义',

        '关联属性N' => '定义',

    ),

    ...

);

下面我们首先来分析下各个关联方式的定义:

HAS_ONE

HAS_ONE关联表示当前模型拥有一个子对象,例如,每个员工都有一个人事档案。我们可以建立一个用户模型 UserModel,并且添加如下关联定义:



PHP代码


  1. class UserModel extends RelationModel   

  2. {   

  3.  public $_link = array(   

  4.        'Profile'=> HAS_ONE,   

  5. );   

  6. }  



上面是最简单的方式,表示其遵循了系统内置的数据库规范,完整的定义方式是:



PHP代码


  1. class UserModel extends RelationModel   

  2. {   

  3.  public $_link = array(   

  4.         'Profile'=>array(   

  5. 'mapping_type' =>HAS_ONE,   

  6.                  'class_name' =>'Profile',   

  7.    // 定义更多的关联 属性   

  8.             ……   

  9.                   ),   

  10. );   

  11. }   



关联HAS_ONE支持的关联属性有:

mapping_type 关联类型,这个在HAS_ONE 关联里面必须使用HAS_ONE 常量定义。

class_name 要关联的模型类名

例如,class_name 定义为Profile的话则表示和另外的Profile模型类关联,这个Profile模型类是无需定义的,系统会自动定位到相关的数据表进行关联。

mapping_name 关联的映射名称,用于获取数据用

该名称不要和当前模型的字段有重复,否则会导致关联数据获取的冲突。如果mapping_name没有定义的话,会取class_name的定义 作为mapping_name。如果class_name也没有定义,则以数组的索引作为mapping_name。

foreign_key 关联的外键名称

外键的默认规则是当前数据对象名称_id,例如:

UserModel对应的可能是表think_user (注意:think只是一个表前缀,可以随意配置)

那么think_user表的外键默认为 user_id,如果不是,就必须在定义关联的时候显式定义 foreign_key 。

condition 关联条件

关联查询的时候会自动带上外键的值,如果有额外的查询条件,可以通过定义关联的condition属性。

mapping_fields 关联要查询的字段

默认情况下,关联查询的关联数据是关联表的全部字段,如果只是需要查询个别字段,可以定义关联的mapping_fields属性。

as_fields直接把关联的字段值映射成数据对象中的某个字段

这个特性是ONE_TO_ONE 关联特有的,可以直接把关联数据映射到数据对象中,而不是作为一个关联数据。当关联数据的字段名和当前数据对象的字段名称有冲突时,还可以使用映射定义。


BELONGS_TO

Belongs_to 关联表示当前模型从属于另外一个父对象,例如每个用户都属于一个部门。我们可以做如下关联定义。      

 'Dept'=> BELONGS_TO

完整方式定义为:



PHP代码


  1. 'Dept'=> array(     

  2. 'mapping_type'=>BELONGS_TO,   

  3.                    'class_name'=>'Dept',   

  4.                    'foreign_key'=>'userId',   

  5.                    'mapping_name'=>'dept',   

  6.   // 定义更多的关联属性   

  7.            ……   

  8.                  ),  



关联BELONGS_TO定义支持的关联属性有:

class_name 要关联的模型类名

mapping_name 关联的映射名称,用于获取数据用

该名称不要和当前模型的字段有重复,否则会导致关联数据获取的冲突。

foreign_key 关联的外键名称

mapping_fields 关联要查询的字段

condition 关联条件

parent_key 自引用关联的关联字段

默认为parent_id

自引用关联是一种比较特殊的关联,也就是关联表就是当前表。

as_fields直接把关联的字段值映射成数据对象中的某个字段


HAS_MANY

HAS_MANY 关联表示当前模型拥有多个子对象,例如每个用户有多篇文章,我们可以这样来定义: 



PHP代码


  1. 'Article'=> HAS_MANY  



完整定义方式为:



PHP代码


  1. 'Article'=> array(     

  2. 'mapping_type'=>HAS_MANY,   

  3.                     'class_name'=>'Article',   

  4.                     'foreign_key'=>'userId',   

  5.                     'mapping_name'=>'articles',   

  6.                     'mapping_order'=>'create_time desc',   

  7.    // 定义更多的关联 属性   

  8.             ……   

  9.                   ),  



关联HAS_MANY定义支持的关联属性有:

class_name 要关联的模型类名

mapping_name 关联的映射名称,用于获取数据用

该名称不要和当前模型的字段有重复,否则会导致关联数据获取的冲突。

foreign_key 关联的外键名称

外键的默认规则是当前数据对象名称_id,例如:

UserModel对应的可能是表think_user (注意:think只是一个表前缀,可以随意配置)

那么think_user表的外键默认为 user_id,如果不是,就必须在定义关联的时候定义 foreign_key 。

parent_key 自引用关联的关联字段

默认为parent_id

condition 关联条件

关联查询的时候会自动带上外键的值,如果有额外的查询条件,可以通过定义关联的condition属性。

mapping_fields 关联要查询的字段

默认情况下,关联查询的关联数据是关联表的全部字段,如果只是需要查询个别字段,可以定义关联的mapping_fields属性。

mapping_limit 关联要返回的记录数目

mapping_order 关联查询的排序


MANY_TO_MANY

MANY_TO_MANY 关联表示当前模型可以属于多个对象,而父对象则可能包含有多个子对象,通常两者之间需要一个中间表类约束和关联。例如每个用户可以属于多个组,每个组可以 有多个用户:

 'Group'=> MANY_TO_MANY

完整定义方式为: 



PHP代码


  1. array(  'mapping_type'=>MANY_TO_MANY,   

  2.            'class_name'=>'Group',   

  3.            'mapping_name'=>'groups',   

  4.           'foreign_key'=>'userId',   

  5.           'relation_foreign_key'=>'goupId',   

  6.           'relation_table'=>'think_gourpUser')  



MANY_TO_MANY支持的关联属性定义有:

class_name 要关联的模型类名

mapping_name 关联的映射名称,用于获取数据用

该名称不要和当前模型的字段有重复,否则会导致关联数据获取的冲突。

foreign_key 关联的外键名称

外键的默认规则是当前数据对象名称_id,例如:

relation_foreign_key 关联表的外键名称

默认的关联表的外键名称是表名_id

mapping_limit 关联要返回的记录数目

mapping_order 关联查询的排序

relation_table 多对多的中间关联表名称

多对多的中间表默认表规则是:数据表前缀_关联操作的主表名_关联表名

如果think_user 和 think_group 存在一个对应的中间表,默认的表名应该是

如果是由group来操作关联表,中间表应该是 think_group_user,如果是从user表来操作,那么应该是think_user_group,也就是说,多对多关联的设置,必须有一个 Model类里面需要显式定义中间表,否则双向操作会出错。

中间表无需另外的id主键(但是这并不影响中间表的操作),通常只是由 user_id 和 group_id 构成。

默认会通过当前模型的getRelationTableName方法来自动获取,如果当前模型是User,关联模型是Group,那么关联表的名 称也就是使用 user_group这样的格式,如果不是默认规则,需要指定relation_table属性。

阅读(568) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~