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 相关文章推荐
APMServ使用说明
Oct 23 PHP
PHP 获取目录下的图片并随机显示的代码
Dec 28 PHP
写出高质量的PHP程序
Feb 04 PHP
php cURL和Rolling cURL并发方式比较
Oct 30 PHP
php curl模拟post提交数据示例
Dec 31 PHP
CI框架Session.php源码分析
Nov 03 PHP
详解PHP+AJAX无刷新分页实现方法
Nov 03 PHP
php实现smarty模板无限极分类的方法
Dec 07 PHP
thinkPHP中多维数组的遍历方法
Jan 09 PHP
thinkphp验证码的实现(form、ajax实现验证)
Jul 28 PHP
PHP基于session.upload_progress 实现文件上传进度显示功能详解
Aug 09 PHP
laravel框架实现去掉URL中index.php的方法
Oct 12 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
《Re:从零开始的异世界生活 冰结之绊》
2020/04/09 日漫
基于php伪静态的实现详细介绍
2013/04/28 PHP
PHP中最容易忘记的一些知识点总结
2013/04/28 PHP
基于PHP5魔术常量与魔术方法的详解
2013/06/13 PHP
thinkPHP多语言切换设置方法详解
2016/11/11 PHP
PHP面向对象程序设计之对象生成方法详解
2016/12/02 PHP
Laravel5.4框架使用socialite实现github登录的方法
2019/03/20 PHP
JavaScript 判断浏览器类型及版本
2009/02/21 Javascript
基于jquery库的tab新形式使用
2012/11/16 Javascript
JS刷新框架外页面七种实现代码
2013/02/18 Javascript
浅谈Sizzle的“编译原理”
2015/04/14 Javascript
js的各种排序算法实现(总结)
2016/07/23 Javascript
Vue和Bootstrap的整合思路详解
2017/06/30 Javascript
js保留两位小数方法总结
2018/01/31 Javascript
基于vue展开收起动画的示例代码
2018/07/05 Javascript
微信小程序个人中心的列表控件实现代码
2020/04/26 Javascript
Nuxt的动态路由和参数校验操作
2020/11/09 Javascript
Python深入学习之装饰器
2014/08/31 Python
在Python中使用lambda高效操作列表的教程
2015/04/24 Python
Python实现抢购IPhone手机
2018/02/07 Python
Python 数据处理库 pandas进阶教程
2018/04/21 Python
对pycharm 修改程序运行所需内存详解
2018/12/03 Python
Pycharm配置远程调试的方法步骤
2018/12/17 Python
Python常用爬虫代码总结方便查询
2019/02/25 Python
基于python二叉树的构造和打印例子
2019/08/09 Python
python3 使用Opencv打开USB摄像头,配置1080P分辨率的操作
2019/12/11 Python
Python图像处理库PIL的ImageFont模块使用介绍
2020/02/26 Python
Python中logging日志记录到文件及自动分割的操作代码
2020/08/05 Python
Spartoo芬兰:欧洲最大的网上鞋店
2016/08/28 全球购物
罗马尼亚购物网站:Vivantis.ro
2019/07/20 全球购物
留学自荐信的技巧
2013/10/17 职场文书
实习鉴定评语
2014/01/19 职场文书
个人贷款收入证明
2014/10/26 职场文书
2015年党日活动总结范文
2015/03/25 职场文书
爱国主义主题班会
2015/08/14 职场文书
Minikube搭建Kubernetes集群
2022/03/31 Servers