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 相关文章推荐
第十一节--重载
Nov 16 PHP
PHP中的float类型使用说明
Jul 27 PHP
php checkbox 取值详细说明
Aug 19 PHP
PHP 透明水印生成代码
Aug 27 PHP
基于initPHP的框架介绍
Apr 18 PHP
PHP错误和异长常处理总结
Mar 06 PHP
PHP全局变量与超级全局变量区别分析
Apr 01 PHP
php实现的二叉树遍历算法示例
Jun 15 PHP
PHP Laravel 上传图片、文件等类封装
Aug 16 PHP
ThinkPHP框架实现导出excel数据的方法示例【基于PHPExcel】
May 12 PHP
PHP7 参数处理机制修改
Mar 09 PHP
PHP中国际化的字符串排序和比较对象详解
Aug 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
实例(Smarty+FCKeditor新闻系统)
2007/01/02 PHP
php 过滤危险html代码
2009/06/29 PHP
PHP实现多条件查询实例代码
2010/07/17 PHP
Yii2中使用join、joinwith多表关联查询
2016/06/30 PHP
visual studio code 调试php方法(图文详解)
2017/09/15 PHP
PHP实现类似题库抽题效果
2018/08/16 PHP
thinkphp5框架API token身份验证功能示例
2019/05/21 PHP
PHP实现批量修改文件名的方法示例
2019/09/18 PHP
thinkphp框架实现路由重定义简化url访问地址的方法分析
2020/04/04 PHP
javascript提取URL的搜索字符串中的参数(自定义函数实现)
2013/01/22 Javascript
jquery和javascript的区别(常用方法比较)
2013/07/04 Javascript
javascript避免数字计算精度误差的方法详解
2014/03/05 Javascript
node.js中实现同步操作的3种实现方法
2014/12/05 Javascript
jQuery实现首页图片淡入淡出效果的方法
2015/06/10 Javascript
jquery淡入淡出效果简单实例
2016/01/14 Javascript
AngularJS基础 ng-keypress 指令简单示例
2016/08/02 Javascript
AngularJS基础 ng-paste 指令简单示例
2016/08/02 Javascript
javascript实现无法关闭的弹框
2016/11/27 Javascript
微信小程序引用公共js里的方法的实例详解
2017/08/17 Javascript
在 Vue.js中优雅地使用全局事件的方法
2019/02/01 Javascript
Win10下python 2.7与python 3.7双环境安装教程图解
2019/10/12 Python
在OpenCV里使用Camshift算法的实现
2019/11/22 Python
python和opencv构建运动检测器的实现
2021/03/03 Python
html5的input的required使用中遇到的问题及解决方法
2018/04/24 HTML / CSS
英国著名的美容护肤和护发产品购物网站:Lookfantastic
2020/11/23 全球购物
面向对象设计的原则是什么
2013/02/13 面试题
2014全国两会学习心得体会1000字
2014/03/10 职场文书
小学二年级评语
2014/04/21 职场文书
招标保密承诺书
2015/01/20 职场文书
骨干教师个人总结
2015/02/11 职场文书
海底两万里读书笔记
2015/06/26 职场文书
田径运动会广播稿
2015/08/19 职场文书
单位提档介绍信
2015/10/22 职场文书
2016五一劳动节慰问信
2015/11/30 职场文书
教你解决往mysql数据库中存入汉字报错的方法
2021/05/06 MySQL
MySQL数据库超时设置配置的方法实例
2021/10/15 MySQL