站长百科 | 数字化技能提升教程 数字化时代生存宝典
首页
数字化百科
电子书
建站程序
开发
服务器
办公软件
开发教程
服务器教程
软件使用教程
运营教程
热门电子书
WordPress教程
宝塔面板教程
CSS教程
Shopify教程
导航
程序频道
推广频道
网赚频道
人物频道
网站程序
网页制作
云计算
服务器
CMS
论坛
网店
虚拟主机
cPanel
网址导航
WIKI使用导航
WIKI首页
最新资讯
网站程序
站长人物
页面分类
使用帮助
编辑测试
创建条目
网站地图
站长百科导航
站长百科
主机侦探
IDCtalk云说
跨境电商导航
WordPress啦
站长专题
网站推广
网站程序
网站赚钱
虚拟主机
cPanel
网址导航专题
云计算
微博营销
虚拟主机管理系统
开放平台
WIKI程序与应用
美国十大主机
编辑“
ThinkPHP开发指南-关联模型之关联定义
”
人物百科
|
营销百科
|
网赚百科
|
站长工具
|
网站程序
|
域名主机
|
互联网公司
|
分类索引
跳转至:
导航
、
搜索
警告:
您没有登录。如果您做出任意编辑,您的IP地址将会公开可见。如果您
登录
或
创建
一个账户,您的编辑将归属于您的用户名,且将享受其他好处。
反垃圾检查。
不要
加入这个!
<span style="border:1px solid #000; float:right; text-align:center; padding:6px;"><strong>导航:</strong>[[ThinkPHP开发指南-模型|上一页]]</span> <div style="clear:both;"></div> [[ThinkPHP]]可以很轻松的完成数据表的关联CURD操作,目前支持的关联关系包括下面四种:'''HAS_ONE'''、'''BELONGS_TO'''、'''HAS_MANY'''、'''MANY_TO_MANY'''。 一个模型根据业务模型的复杂程度可以同时定义多个关联,不受限制,所有的关联定义都统一在模型类的 $_link 成员变量里面定义,并且可以支持动态定义。关联定义的格式是: <pre> protected $_link = array( '关联1' => array( '关联属性1' => '定义', '关联属性N' => '定义', ), '关联2' => array( '关联属性1' => '定义', '关联属性N' => '定义', ), ... ); </pre> 下面我们首先来分析下各个关联方式的定义: *'''HAS_ONE''' HAS_ONE关联表示当前模型拥有一个子对象,例如,每个员工都有一个人事档案。我们可以建立一个用户模型UserModel,并且添加如下关联定义: ''' PHP代码''' <pre> class UserModel extends RelationModel { public $_link = array( 'Profile'=> HAS_ONE, ); } </pre> 上面是最简单的方式,表示其遵循了系统内置的数据库规范,完整的定义方式是: '''PHP代码''' <pre> class UserModel extends RelationModel { public $_link = array( 'Profile'=>array( 'mapping_type' =>HAS_ONE, 'class_name' =>'Profile', // 定义更多的关联属性 …… ), ); } </pre> 关联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代码''' <pre> 'Dept'=> array( 'mapping_type'=>BELONGS_TO, 'class_name'=>'Dept', 'foreign_key'=>'userId', 'mapping_name'=>'dept', // 定义更多的关联属性 …… ), </pre> 关联BELONGS_TO定义支持的关联属性有: *class_name 要关联的模型类名 *mapping_name 关联的映射名称,用于获取数据用 (该名称不要和当前模型的字段有重复,否则会导致关联数据获取的冲突。) *foreign_key 关联的外键名称 *mapping_fields 关联要查询的字段 *condition 关联条件 *parent_key 自引用关联的关联字段 *默认为parent_id 自引用关联是一种比较特殊的关联,也就是关联表就是当前表。as_fields直接把关联的字段值映射成数据对象中的某个字段 *'''HAS_MANY''' HAS_MANY 关联表示当前模型拥有多个子对象,例如每个用户有多篇文章,我们可以这样来定义: '''[[PHP]]代码''' <pre> 'Article'=> HAS_MANY </pre> 完整定义方式为: '''PHP代码''' <pre> 'Article'=> array( 'mapping_type'=>HAS_MANY, 'class_name'=>'Article', 'foreign_key'=>'userId', 'mapping_name'=>'articles', 'mapping_order'=>'create_time desc', // 定义更多的关联属性 …… ), </pre> 关联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代码''' <pre> array( 'mapping_type'=>MANY_TO_MANY, 'class_name'=>'Group', 'mapping_name'=>'groups', 'foreign_key'=>'userId', 'relation_foreign_key'=>'goupId', 'relation_table'=>'think_gourpUser') </pre> 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属性。 [[category:ThinkPHP]]
摘要:
请注意,您对站长百科的所有贡献都可能被其他贡献者编辑,修改或删除。如果您不希望您的文字被任意修改和再散布,请不要提交。
您同时也要向我们保证您所提交的内容是您自己所作,或得自一个不受版权保护或相似自由的来源(参阅
Wordpress-mediawiki:版权
的细节)。
未经许可,请勿提交受版权保护的作品!
取消
编辑帮助
(在新窗口中打开)