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的5个入手程序
Nov 23 PHP
php中is_null,empty,isset,unset 的区别详细介绍
Apr 28 PHP
探讨:如何使用PHP实现计算两个日期间隔的年、月、周、日数
Jun 13 PHP
PHP数组排序函数合集 以及它们之间的联系分析
Jun 27 PHP
PHP 获取远程文件大小的3种解决方法
Jul 11 PHP
PHP IE中下载附件问题解决方法
Jan 07 PHP
分享一则PHP定义函数代码
Feb 26 PHP
PHP中返回引用类型的方法
Apr 03 PHP
php 生成签名及验证签名详解
Oct 26 PHP
PHP redis实现超迷你全文检索
Mar 04 PHP
一个非常实用的php文件上传类
Jul 04 PHP
PHP连接MSSQL数据库案例,PHPWAMP多个PHP版本连接SQL Server数据库
Apr 16 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使用GD库创建图片缩略图的方法
2015/06/10 PHP
php限制文件下载速度的代码
2015/10/20 PHP
PHP简单检测网址是否能够正常打开的方法
2016/09/04 PHP
PDO::getAttribute讲解
2019/01/28 PHP
laravel orm 关联条件查询代码
2019/10/21 PHP
php实现简易计算器
2020/08/28 PHP
Javascript中的常见排序算法
2007/03/27 Javascript
我见过最全的个人js加解密功能页面
2007/12/12 Javascript
解析DHTML,JavaScript,DOM,BOM以及WEB标准的描述
2013/06/19 Javascript
使用js实现关闭js弹出层的窗口
2014/02/10 Javascript
js数值和和字符串进行转换时可以对不同进制进行操作
2014/03/05 Javascript
基于Bootstrap+jQuery.validate实现表单验证
2016/05/30 Javascript
AngularJS中的JSONP实例解析
2016/12/01 Javascript
Angularjs中的ui-bootstrap的使用教程
2017/02/19 Javascript
Node.js如何使用Diffie-Hellman密钥交换算法详解
2017/09/05 Javascript
Nuxt.js踩坑总结分享
2018/01/18 Javascript
微信小程序App生命周期详解
2018/01/31 Javascript
基于vue-cli npm run build之后vendor.js文件过大的解决方法
2018/09/27 Javascript
Vue项目中使用jsonp抓取跨域数据的方法
2019/11/10 Javascript
Python列表list数组array用法实例解析
2014/10/28 Python
Python爬虫信息输入及页面的切换方法
2018/05/11 Python
django 多数据库配置教程
2018/05/30 Python
Python类的继承、多态及获取对象信息操作详解
2019/02/28 Python
flask框架单元测试原理与用法实例分析
2019/07/23 Python
基于django传递数据到后端的例子
2019/08/16 Python
python3光学字符识别模块tesserocr与pytesseract的使用详解
2020/02/26 Python
Python异常原理及异常捕捉实现过程解析
2020/03/25 Python
python中pyplot基础图标函数整理
2020/11/10 Python
荷兰家电销售网站:Welhof
2020/12/08 全球购物
2014小学生国庆65周年演讲稿
2014/09/21 职场文书
工作期间打牌检讨书范文
2014/11/20 职场文书
给老婆的检讨书1000字
2015/01/01 职场文书
免职通知
2015/04/23 职场文书
学校2015年纠风工作总结
2015/05/15 职场文书
2017寒假社会实践心得体会范文
2016/01/14 职场文书
Java 通过手写分布式雪花SnowFlake生成ID方法详解
2022/04/07 Java/Android