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 !function_exists("T7FC56270E7A70FA81A5935B72EACBE29"))代码解密
Jan 07 PHP
解析php session_set_save_handler 函数的用法(mysql)
Jun 29 PHP
ueditor 1.2.6 使用方法说明
Jul 24 PHP
php_screw安装使用教程(另一个PHP代码加密实现)
May 29 PHP
php中json_encode处理gbk与gb2312中文乱码问题的解决方法
Jul 10 PHP
浅谈php自定义错误日志
Feb 13 PHP
PHP+MySQL之Insert Into数据插入用法分析
Sep 27 PHP
PHP封装的字符串加密解密函数
Dec 18 PHP
thinkphp框架下实现登录、注册、找回密码功能
Apr 06 PHP
利用php_imagick实现复古效果的方法
Oct 18 PHP
php常用数组函数实例小结
Dec 29 PHP
php图片合成方法(多张图片合成一张)
Nov 25 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开启gzip页面压缩实例代码
2010/03/11 PHP
php调用nginx的mod_zip模块打包ZIP文件
2014/06/11 PHP
基于php流程控制语句和循环控制语句(讲解)
2017/10/23 PHP
PHP常用的类封装小结【4个工具类】
2019/06/28 PHP
DWR Ext 加载数据
2009/03/22 Javascript
JQuery拖拽元素改变大小尺寸实现代码
2012/12/10 Javascript
纯js网页画板(Graphics)类简介及实现代码
2012/12/24 Javascript
图片动画横条广告带上下滚动可自定义图片、链接等等
2013/10/20 Javascript
一种新的javascript对象创建方式Object.create()
2015/12/28 Javascript
[原创]JQuery 在表单提交之前修改 提交的值
2016/04/14 Javascript
全国省市二级联动下拉菜单 js版
2016/05/10 Javascript
一个仿微博登陆邮箱提示框js开发案例
2016/07/28 Javascript
简单理解vue中track-by属性
2016/10/26 Javascript
setTimeout学习小结
2017/02/08 Javascript
详解解决Vue相同路由参数不同不会刷新的问题
2018/10/12 Javascript
vue代码分割的实现(codesplit)
2018/11/13 Javascript
使用nodejs分离html文件里的js和css详解
2019/04/12 NodeJs
详解vue的双向绑定原理及实现
2019/05/05 Javascript
微信小程序获取用户信息并保存登录状态详解
2019/05/10 Javascript
JavaScript解析JSON数据示例
2019/07/16 Javascript
解决layer弹出层的内容页点击按钮跳转到新的页面问题
2019/09/14 Javascript
[45:06]完美世界DOTA2联赛PWL S2 Magma vs InkIce 第二场 11.28
2020/12/02 DOTA
在Python中使用元类的教程
2015/04/28 Python
python脚本设置超时机制系统时间的方法
2016/02/21 Python
详解Python迭代和迭代器
2016/03/28 Python
python基础while循环及if判断的实例讲解
2017/08/25 Python
基于Python闭包及其作用域详解
2017/08/28 Python
Python爬虫框架Scrapy基本用法入门教程
2018/07/26 Python
keras自动编码器实现系列之卷积自动编码器操作
2020/07/03 Python
使用OpenCV实现道路车辆计数的使用方法
2020/07/15 Python
Python 可视化神器Plotly详解
2020/12/26 Python
Old Navy加拿大官网:美式休闲服饰品牌
2017/09/26 全球购物
Lookfantastic葡萄牙官方网站:欧洲第一大化妆品零售商
2018/03/17 全球购物
授权委托书(法人单位用)
2014/09/29 职场文书
2015年个人现实表现材料
2014/12/10 职场文书
2019年入党思想汇报
2019/03/25 职场文书