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编程与应用
Oct 09 PHP
PHP中的正规表达式(二)
Oct 09 PHP
iis下php mail函数的sendmail配置方法(官方推荐)
Apr 25 PHP
优化PHP代码技巧的小结
Jun 02 PHP
鸡肋的PHP单例模式应用详解
Jun 03 PHP
开启PHP的伪静态模式
Dec 31 PHP
微信公众号模板消息群发php代码示例
Dec 29 PHP
PHP实现批量删除(封装)
Apr 28 PHP
PHP删除二维数组中相同元素及数组重复值的方法示例
May 05 PHP
PHP实现批量重命名某个文件夹下所有文件的方法
Sep 04 PHP
PHP+MySQL实现输入页码跳转到指定页面功能示例
Jun 01 PHP
PHP验证类的封装与使用方法详解
Jan 10 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 数组遍历顺序理解
2009/09/09 PHP
php 连接mysql连接被重置的解决方法
2011/02/15 PHP
php图像处理类实例
2015/07/28 PHP
php数组函数array_walk用法示例
2016/05/26 PHP
prototype.js的Ajax对象
2006/09/23 Javascript
javascript淡入淡出效果的实现思路
2012/03/31 Javascript
关于JS控制代码暂停的实现方法分享
2012/10/11 Javascript
jquery选择器-根据多个属性选择示例代码
2013/10/21 Javascript
Javascript核心读书有感之词法结构
2015/02/01 Javascript
纯HTML5制作围住神经猫游戏-附源码下载
2015/08/23 Javascript
AngularJS内建服务$location及其功能详解
2016/07/01 Javascript
Three.js学习之文字形状及自定义形状
2016/08/01 Javascript
Emberjs 通过 axios 下载文件的方法
2019/09/03 Javascript
[05:29]2014DOTA2国际邀请赛 赛后专访:LGDNewbee顺利过关
2014/07/13 DOTA
python 数据加密代码
2008/12/24 Python
Python 专题一 函数的基础知识
2017/03/16 Python
PyCharm代码整体缩进,反向缩进的方法
2018/06/25 Python
10 行 Python 代码教你自动发送短信(不想回复工作邮件妙招)
2018/10/11 Python
Windows下安装Scrapy
2018/10/17 Python
对python自动生成接口测试的示例讲解
2018/11/30 Python
Python面向对象程序设计多继承和多态用法示例
2019/04/08 Python
使用Python实现跳一跳自动跳跃功能
2019/07/10 Python
python给指定csv表格中的联系人群发邮件(带附件的邮件)
2019/12/31 Python
Pytorch保存模型用于测试和用于继续训练的区别详解
2020/01/10 Python
基于Pycharm加载多个项目过程图解
2020/01/19 Python
SmartBuyGlasses比利时:购买品牌太阳镜和眼镜
2019/08/09 全球购物
行政助理工作职责范本
2014/03/04 职场文书
法人代表授权委托书
2014/04/08 职场文书
私人房屋买卖协议书
2014/10/04 职场文书
2014年统战工作总结
2014/12/09 职场文书
饭店服务员岗位职责
2015/02/09 职场文书
2015最新婚礼司仪主持词
2015/06/30 职场文书
国庆节主题班会
2015/08/15 职场文书
pycharm 如何查看某一函数源码的快捷键
2021/05/12 Python
JavaScript 原型与原型链详情
2021/11/02 Javascript
Vue ECharts实现机舱座位选择展示功能
2022/05/15 Vue.js