当前位置:K88软件开发文章中心网站服务器框架ThinkPHP → 文章内容

关联模型

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-26 15:33:27

由 AdairSweet 创建, 最后一次修改 2016-02-24 关联关系通常我们所说的关联关系包括下面三种:一对一关联 :ONE_TO_ONE,包括HAS_ONE 和 BELONGS_TO 一对多关联 :ONE_TO_MANY,包括HAS_MANY 和 BELONGS_TO多对多关联 :MANY_TO_MANY关联关系必然有一个参照表,例如:有一个员工档案管理系统项目,这个项目要包括下面的一些数据表:基本信息表、员工档案表、部门表、项目组表、银行卡表(用来记录员工的银行卡资料)。这些数据表之间存在一定的关联关系,我们以员工基本信息表为参照来分析和其他表之间的关联:每个员工必然有对应的员工档案资料,所以属于HAS_ONE关联;每个员工必须属于某个部门,所以属于BELONGS_TO关联;每个员工可以有多个银行卡,但是每张银行卡只可能属于一个员工,因此属于HAS_MANY关联;每个员工可以同时在多个项目组,每个项目组同时有多个员工,因此属于MANY_TO_MANY关联;分析清楚数据表之前的关联关系后,我们才可以进行关联定义和关联操作。 关联定义ThinkPHP可以很轻松的完成数据表的关联CURD操作,目前支持的关联关系包括下面四种:HAS_ONE、BELONGS_TO、HAS_MANY和MANY_TO_MANY。一个模型根据业务模型的复杂程度可以同时定义多个关联,不受限制,所有的关联定义都统一在模型类的 $_link 成员变量里面定义,并且可以支持动态定义。要支持关联操作,模型类必须继承Think\Model\RelationModel类,关联定义的格式是:namespace Home\Model;use Think\Model\RelationModel;class UserModel extends RelationModel{ protected $_link = array( '关联1' => array( '关联属性1' => '定义', '关联属性N' => '定义', ), '关联2' => array( '关联属性1' => '定义', '关联属性N' => '定义', ), '关联3' => HAS_ONE, // 快捷定义 ... );}下面我们首先来分析下各个关联方式的定义:HAS_ONEHAS_ONE关联表示当前模型拥有一个子对象,例如,每个员工都有一个人事档案。我们可以建立一个用户模型UserModel,并且添加如下关联定义:namespace Home\Model;use Think\Model\RelationModel;class UserModel extends RelationModel{ protected $_link = array( 'Profile'=> self::HAS_ONE, );}上面是最简单的方式,表示其遵循了系统内置的数据库规范,完整的定义方式是:namespace Home\Model;use Think\Model\RelationModel;class UserModel extends RelationModel{ protected $_link = array( 'Profile'=>array( 'mapping_type' => self::HAS_ONE, 'class_name' => 'Profile', // 定义更多的关联属性 …… ), );}关联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_TOBelongs_to 关联表示当前模型从属于另外一个父对象,例如每个用户都属于一个部门。我们可以做如下关联定义。'Dept' => self::BELONGS_TO完整方式定义为:'Dept' => array( 'mapping_type' => self::BELONGS_TO, 'class_name' => 'Dept', 'foreign_key' => 'userId', 'mapping_name' => 'dept', // 定义更多的关联属性 ……),关联BELONGS_TO定义支持的关联属性有: 属性描述class_name要关联的模型类名mapping_name关联的映射名称,用于获取数据用 该名称不要和当前模型的字段有重复,否则会导致关联数据获取的冲突。foreign_key关联的外键名称mapping_fields关联要查询的字段condition关联条件parent_key自引用关联的关联字段 默认为parent_id 自引用关联是一种比较特殊的关联,也就是关联表就是当前表。as_fields直接把关联的字段值映射成数据对象中的某个字段HAS_MANYHAS_MANY 关联表示当前模型拥有多个子对象,例如每个用户有多篇文章,我们可以这样来定义:'Article' => self::HAS_MANY完整定义方式为:'Article' => array( 'mapping_type' => self::HAS_MANY, 'class_name' => 'Article', 'foreign_key' => 'userId', 'mapping_name' => 'articles', 'mapping_order' => 'create_time desc', // 定义更多的关联属性 ……),关联HAS_MANY定义支持的关联属性有: 属性描述class_name要关联的模型类名mapping_name关联的映射名称,用于获取数据用 该名称不要和当前模型的字段有重复,否则会导致关联数据获取的冲突。foreign_key关联的外键名称parent_key自引用关联的关联字段 默认为parent_idcondition关联条件 关联查询的时候会自动带上外键的值,如果有额外的查询条件,可以通过定义关联的condition属性。mapping_fields关联

[1] [2]  下一页


关联模型