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+ACCESS 文章管理程序代码
Jun 21 PHP
五款常用mysql slow log分析工具的比较分析
May 22 PHP
PHP实现时间轴函数代码
Oct 08 PHP
php5.2 Json不能正确处理中文、GB编码的解决方法
Mar 28 PHP
php cli换行示例
Apr 22 PHP
一个php短网址的生成代码(仿微博短网址)
May 07 PHP
使用YUI+Ant 实现JS CSS压缩
Sep 02 PHP
php身份证号码检查类实例
Jun 18 PHP
7个鲜为人知却非常实用的PHP函数
Jul 01 PHP
PHP判断数组是否为空的常用方法(五种方法)
Feb 08 PHP
PHP 实现人民币小写转换成大写的方法及大小写转换函数
Nov 17 PHP
PHP实现将多个文件压缩成zip格式并下载到本地的方法示例
May 23 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设计模式 DAO(数据访问对象模式)
2011/06/26 PHP
php递归获取目录内文件(包含子目录)封装类分享
2013/12/25 PHP
采用header定义为文件然后readfile下载(隐藏下载地址)
2014/01/31 PHP
php判断正常访问和外部访问的示例
2014/02/10 PHP
PHP临时文件的安全性分析
2014/07/04 PHP
php中使用gd库实现远程图片下载实例
2015/05/12 PHP
详解thinkphp实现excel数据的导入导出(附完整案例)
2016/12/29 PHP
PHP实现获取毫秒时间戳的方法【使用microtime()函数】
2019/03/01 PHP
PHP检查文件是否存在,不存在自动创建及读取文件内容操作示例
2020/01/23 PHP
驱动事件的addEvent.js代码
2007/03/27 Javascript
innerhtml用法 innertext用法 以及innerHTML与innertext的区别
2009/10/26 Javascript
javascript 嵌套的函数(作用域链)
2010/03/15 Javascript
离开页面时检测表单元素是否被修改,提示保存的js代码
2010/08/25 Javascript
基于jquery的横向滚动条(滑动条)
2011/02/24 Javascript
你必须知道的Javascript知识点之"字面量和对应类型"说明介绍
2013/04/23 Javascript
cocos2dx骨骼动画Armature源码剖析(三)
2015/09/08 Javascript
AngularJS实现树形结构(ztree)菜单示例代码
2016/09/18 Javascript
Angular实现的进度条功能示例
2018/02/18 Javascript
微信小程序button标签open-type属性原理解析
2020/01/21 Javascript
Vue的全局过滤器和私有过滤器的实现
2020/04/20 Javascript
Vue生命周期activated之返回上一页不重新请求数据操作
2020/07/26 Javascript
Python数据类型详解(一)字符串
2016/05/08 Python
Python变量赋值的秘密分享
2018/04/03 Python
用Python写脚本,实现完全备份和增量备份的示例
2018/04/29 Python
python检测空间储存剩余大小和指定文件夹内存占用的实例
2018/06/11 Python
Python爬虫之正则表达式的使用教程详解
2018/10/25 Python
使用PIL(Python-Imaging)反转图像的颜色方法
2019/01/24 Python
python、Matlab求定积分的实现
2019/11/20 Python
python数据类型强制转换实例详解
2020/06/22 Python
你可能不熟练的十个前端HTML5经典面试题
2018/07/03 HTML / CSS
英国马匹装备和马术用品购物网站:Equine Superstore
2019/03/03 全球购物
老公保证书范文
2014/04/29 职场文书
2014年教师节演讲稿范文
2014/09/10 职场文书
党员应该树立反腐倡廉的坚定意识思想汇报
2014/09/12 职场文书
angular异步验证器防抖实例详解
2022/03/31 Javascript
nginx配置之并发频次限制
2022/04/18 Servers