ThinkPHP关联模型操作实例分析


Posted in PHP onSeptember 23, 2012

通常我们所说的关联关系包括下面三种:

◇ 一对一关联 : ONE_TO_ONE , 包括 HAS_ONE 和 BELONGS_TO
◇ 一对多关联 : ONE_TO_MANY , 包括 HAS_MANY 和 BELONGS_TO
◇ 多对多关联 : MANY_TO_MANY

关联定义

数据表的关联 CURD 操作,目前支持的关联关系包括下面四种:HAS_ONE 、 BELONGS_TO 、 HAS_MANY 、 MANY_TO_MANY 。

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

protected $_link = array( 
' 关联 1' => array( 
' 关联属性 1' => ' 定义 ', 
' 关联属性 N' => ' 定义 ', 
), 
' 关联 2' => array( 
' 关联属性 1' => ' 定义 ', 
' 关联属性 N' => ' 定义 ', 
), 
... 
);

HAS_ONE 关联方式的定义:
class UserModel extends RelationModel 
{ 
public $_link = array( 
'Profile'=> array( 
'mapping_type' =>HAS_ONE, 
'class_name'=>'Profile', 
// 定义更多的关联属性 
…… 
) , 
); 
}

mapping_type 关联类型,这个在 HAS_ONE 关联里面必须使用 HAS_ONE 常量定义。
class_name 要关联的模型类名
mapping_name 关联的映射名称,用于获取数据用
foreign_key 关联的外键名称
condition 关联条件
mapping_fields 关联要查询的字段
as_fields 直接把关联的字段值映射成数据对象中的某个字段

BELONGS_TO 关联方式的定义:

'Dept'=> array( 
'mapping_type'=>BELONGS_TO, 
'class_name'=>'Dept', 
'foreign_key'=>'userId', 
'mapping_name'=>'dept', 
// 定义更多的关联属性 
…… 
) ,

class_name 要关联的模型类名
mapping_name 关联的映射名称,用于获取数据用
foreign_key 关联的外键名称
mapping_fields 关联要查询的字段
condition 关联条件
parent_key 自引用关联的关联字段
as_fields 直接把关联的字段值映射成数据对象中的某个字段

HAS_MANY 关联方式的定义:

'Article'=> array( 
'mapping_type' =>HAS_MANY, 
'class_name'=>'Article', 
'foreign_key'=>'userId', 
'mapping_name'=>'articles', 
'mapping_order'=>'create_time desc', 
// 定义更多的关联属性 
…… 
) ,

class_name 要关联的模型类名
mapping_name 关联的映射名称,用于获取数据用
foreign_key 关联的外键名称
parent_key 自引用关联的关联字段
condition 关联条件
mapping_fields 关联要查询的字段
mapping_limit 关联要返回的记录数目
mapping_order 关联查询的排序

MANY_TO_MANY 关联方式的定义:

"Group"=>array( 
'mapping_type'=>MANY_TO_MANY, 
'class_name'=>'Group', 
'mapping_name'=>'groups', 
'foreign_key'=>'userId', 
'relation_foreign_key'=>'goupId', 
'relation_table'=>'think_gourpUser' 
)

class_name 要关联的模型类名
mapping_name 关联的映射名称,用于获取数据用
foreign_key 关联的外键名称
relation_foreign_key 关联表的外键名称
mapping_limit 关联要返回的记录数目
mapping_order 关联查询的排序
relation_table 多对多的中间关联表名称

关联查询

使用 relation 方法进行关联操作, relation 方法不但可以启用关联还可以控制局部关联操作,实现了关联操作一切尽在掌握之中。

$User = D( "User" );
$user = $User->realtion(true)->find(1);

输出 $user 结果可能是类似于下面的数据:

array( 
'id'=>1, 
'account'=>'ThinkPHP', 
'password'=>'123456', 
'Profile'=> array( 
'email'=>'liu21st@gmail.com', 
'nickname'=>'流年', 
) , 
)

关联写入
$User = D( "User" ); 
$data = array(); 
$data["account"]="ThinkPHP"; 
$data["password"]="123456"; 
$data["Profile"]=array( 
'email'=>'liu21st@gmail.com', 
'nickname' =>' 流年 ', 
) ; 
$result = $User->relation(true)->add($user);

这样就会自动写入关联的 Profile 数据。

关联更新

$User = D( "User" ); 
$data["account"]= "ThinkPHP"; 
$data["password"]= "123456"; 
$data["Profile"]=array( 
'email'=>'liu21st@gmail.com', 
'nickname' =>' 流年 ', 
) ; 
$result =$User-> relation(true)->where(‘id=3')->save($data);

关联删除

$result =$User->relation(true)->delete( "3" );

PHP 相关文章推荐
用PHP发电子邮件
Oct 09 PHP
如何跨站抓取别的站点的页面的补充
Oct 09 PHP
PHP为表单获取的URL 地址预设 http 字符串函数代码
May 26 PHP
一个php短网址的生成代码(仿微博短网址)
May 07 PHP
ECMall支持SSL连接邮件服务器的配置方法详解
May 19 PHP
PHP使用GIFEncoder类生成的GIF动态图片验证码
Jul 01 PHP
CodeIgniter框架URL路由总结
Sep 03 PHP
thinkPHP模型初始化实例分析
Dec 03 PHP
CI配置多数据库访问的方法
Mar 28 PHP
Symfony2创建基于域名的路由相关示例
Nov 14 PHP
php.ini中date.timezone设置详解
Nov 20 PHP
用PHP将Unicode 转化为UTF-8的实现方法(推荐)
Feb 08 PHP
Linux下CoreSeek及PHP扩展模块的安装
Sep 23 #PHP
Thinkphp模板中使用自定义函数的方法
Sep 23 #PHP
如何获知PHP程序占用多少内存(memory_get_usage)
Sep 23 #PHP
PHP管理内存函数 memory_get_usage()使用介绍
Sep 23 #PHP
查找mysql字段中固定字符串并替换的几个方法
Sep 23 #PHP
php获取ip的三个属性区别介绍(HTTP_X_FORWARDED_FOR,HTTP_VIA,REMOTE_ADDR)
Sep 23 #PHP
PHP分多步骤填写发布信息的简单方法实例代码
Sep 23 #PHP
You might like
PHP HTML代码串 截取实现代码
2009/06/29 PHP
php版微信公众平台回复中文出现乱码问题的解决方法
2016/09/22 PHP
PHP实现模拟http请求的方法分析
2017/12/20 PHP
PHP论坛实现积分系统的思路代码详解
2020/06/01 PHP
jquery中animate动画积累的解决方法
2013/10/05 Javascript
基于jQuery日历插件制作日历
2016/03/11 Javascript
js绘制购物车抛物线动画
2020/11/18 Javascript
JS表单数据验证的正则表达式(常用)
2017/02/18 Javascript
Javascript实现基本运算器
2017/07/15 Javascript
微信小程序出现wx.navigateTo页面不跳转问题的解决方法
2017/12/26 Javascript
js实现input密码框显示/隐藏功能
2020/09/10 Javascript
Vue中使用方法、计算属性或观察者的方法实例详解
2018/10/31 Javascript
富文本编辑器vue2-editor实现全屏功能
2019/05/26 Javascript
微信小程序发布新版本时自动提示用户更新的方法
2019/06/07 Javascript
React 实现车牌键盘的示例代码
2019/12/20 Javascript
Node.js 在本地生成日志文件的方法
2020/02/07 Javascript
基于Element封装一个表格组件tableList的使用方法
2020/06/29 Javascript
vue打开子组件弹窗都刷新功能的实现
2020/09/21 Javascript
[01:14:19]NAVI vs Mineski 2019国际邀请赛淘汰赛 败者组BO1 8.20.mp4
2020/07/19 DOTA
Python BeautifulSoup中文乱码问题的2种解决方法
2014/04/22 Python
Python实现希尔排序算法的原理与用法实例分析
2017/11/23 Python
用Python写王者荣耀刷金币脚本
2017/12/21 Python
Tensorflow 查看变量的值方法
2018/06/14 Python
pycharm: 恢复(reset) 误删文件的方法
2018/10/22 Python
Python3基础教程之递归函数简单示例
2019/06/07 Python
Django框架表单操作实例分析
2019/11/04 Python
详解css3中dispaly的Grid布局与Flex布局
2020/09/11 HTML / CSS
Ted Baker英国官网:男士和女士服装及配件
2017/03/13 全球购物
自荐信如何“自荐”
2013/10/24 职场文书
创业计划书中包含的9个方面
2013/12/26 职场文书
幼儿园秋游感想
2014/03/12 职场文书
医学生毕业自我鉴定
2014/03/26 职场文书
群众路线教育实践活动个人对照检查材料
2014/09/22 职场文书
拾金不昧表扬稿大全
2015/05/05 职场文书
国际贸易实训总结
2015/08/03 职场文书
pandas DataFrame.shift()函数的具体使用
2021/05/24 Python