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 相关文章推荐
一个ORACLE分页程序,挺实用的.
Oct 09 PHP
php 随机数的产生、页面跳转、件读写、文件重命名、switch语句
Aug 07 PHP
PHP生成UTF8文件的方法
May 15 PHP
Thinkphp模板中截取字符串函数简介
Jun 17 PHP
PHP中使用addslashes函数转义的安全性原理分析
Nov 03 PHP
php实现两表合并成新表并且有序排列的方法
Dec 05 PHP
php cookie工作原理与实例详解
Jul 18 PHP
php多线程并发实现方法
Sep 30 PHP
PHP中获取文件创建日期、修改日期、访问时间的方法
Nov 05 PHP
php中curl和soap方式请求服务超时问题的解决
Jun 11 PHP
详解php协程知识点
Sep 21 PHP
PHP中strval()函数实例用法
Jun 07 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原理之异常机制
2010/08/21 PHP
基于jquery的下拉框改变动态添加和删除表格实现代码
2020/09/12 Javascript
javascript高级程序设计第二版第十二章事件要点总结(常用的跨浏览器检测方法)
2012/08/22 Javascript
js中window.open()的所有参数详细解析
2014/01/09 Javascript
jquery制作多功能轮播图插件
2015/04/02 Javascript
js时钟翻牌效果实现代码分享
2020/07/31 Javascript
AngularJS中处理多个promise的方式
2016/02/02 Javascript
jQuery简单动画变换效果实例分析
2016/07/04 Javascript
JavaScript关于提高网站性能的几点建议(一)
2016/07/24 Javascript
微信公众号支付H5调用支付解析
2016/11/04 Javascript
AngularJS 中使用Swiper制作滚动图不能滑动的解决方法
2016/11/15 Javascript
JS动态遍历json中所有键值对的方法(不知道属性名的情况)
2016/12/28 Javascript
Vue 2.0+Vue-router构建一个简单的单页应用(附源码)
2017/03/14 Javascript
JS回调函数基本定义与用法实例分析
2017/05/24 Javascript
vue源码入口文件分析(推荐)
2018/01/30 Javascript
vue中实现图片和文件上传的示例代码
2018/03/16 Javascript
微信小程序日期选择器实例代码
2018/07/18 Javascript
解决vue js IOS H5focus无法自动弹出键盘的问题
2018/08/30 Javascript
用WebStorm进行Angularjs 2开发(环境篇:Windows 10,Angular-cli方式)
2018/12/05 Javascript
jQuery实现当拉动滚动条到底部加载数据的方法分析
2019/01/24 jQuery
如何在微信小程序里面退出小程序的方法
2019/04/28 Javascript
详解Webpack抽离第三方类库以及common解决方案
2020/03/30 Javascript
玩转python爬虫之爬取糗事百科段子
2016/02/17 Python
Python中创建字典的几种方法总结(推荐)
2017/04/27 Python
Python排序搜索基本算法之希尔排序实例分析
2017/12/09 Python
python爬取网页转换为PDF文件
2018/06/07 Python
Python发展史及网络爬虫
2019/06/19 Python
用python生成(动态彩色)二维码的方法(使用myqr库实现)
2019/06/24 Python
详解使用python绘制混淆矩阵(confusion_matrix)
2019/07/14 Python
python中pygame安装过程(超级详细)
2019/08/04 Python
三个python爬虫项目实例代码
2019/12/28 Python
Python DataFrame使用drop_duplicates()函数去重(保留重复值,取重复值)
2020/07/20 Python
2014教师“四风问题”对照检查材料思想汇报
2014/09/16 职场文书
2014年班组建设工作总结
2014/12/01 职场文书
先进党员事迹材料
2014/12/24 职场文书
PHP 时间处理类Carbon
2022/05/20 PHP