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简单命令代码集锦
Sep 24 PHP
php mysql索引问题
Jun 07 PHP
php结合飞信 免费天气预报短信
May 07 PHP
php统计文件大小,以GB、MB、KB、B输出
May 29 PHP
PHP连接MongoDB示例代码
Sep 06 PHP
php权重计算方法代码分享
Jan 09 PHP
php匹配字符中链接地址的方法
Dec 22 PHP
PHP基于MySQL数据库实现对象持久层的方法
Jun 17 PHP
php判断对象是派生自哪个类的方法
Jun 20 PHP
Yii全局函数用法示例
Jan 22 PHP
[原创]php正则删除html代码中class样式属性的方法
May 24 PHP
PHP在同一域名下两个不同的项目做独立登录机制详解
Sep 22 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中文处理 中文字符串截取(mb_substr)和获取中文字符串字数
2011/11/10 PHP
web目录下不应该存在多余的程序(安全考虑)
2012/05/09 PHP
php微信公众平台开发(四)回复功能开发
2016/12/06 PHP
Yii框架批量插入数据扩展类的简单实现方法
2017/05/23 PHP
PHP实现简单的模板引擎功能示例
2017/09/02 PHP
Laravel框架实现多个视图共享相同数据的方法详解
2019/07/09 PHP
PHP7修改的函数
2021/03/09 PHP
谈谈关于JavaScript 中的 MVC 模式
2013/04/11 Javascript
开发中可能会用到的jQuery小技巧
2014/03/07 Javascript
Nodejs获取网络数据并生成Excel表格
2020/03/31 NodeJs
学习Node.js模块机制
2016/10/17 Javascript
微信小程序 登录实例详解
2017/01/16 Javascript
vue实现app页面切换动画效果实例
2017/05/23 Javascript
基于jQuery选择器之表单对象属性筛选选择器的实例
2017/09/19 jQuery
webpack4 SCSS提取和懒加载的示例
2018/09/03 Javascript
Vue中jsx不完全应用指南小结
2019/11/01 Javascript
使用p5.js临摹动态图片
2019/11/04 Javascript
Vue中强制组件重新渲染的正确方法
2021/01/03 Vue.js
JavaScript实现4位随机验证码的生成
2021/01/28 Javascript
[02:41]DOTA2亚洲邀请赛小组赛第三日 赛事回顾
2015/02/01 DOTA
Django静态资源URL STATIC_ROOT的配置方法
2014/11/08 Python
Python采用socket模拟TCP通讯的实现方法
2014/11/19 Python
讲解Python中fileno()方法的使用
2015/05/24 Python
画pytorch模型图,以及参数计算的方法
2019/08/17 Python
WxPython实现无边框界面
2019/11/18 Python
PHP基于phpqrcode类库生成二维码过程解析
2020/05/28 Python
css3实现超炫风车特效
2014/11/12 HTML / CSS
Soft Cotton捷克:来自爱琴海棉花的浴袍
2017/02/01 全球购物
荷兰本土平价百货:HEMA
2017/10/23 全球购物
SHEIN美国:购买时髦的女性服装
2020/12/02 全球购物
省级优秀班集体申报材料
2014/05/25 职场文书
欠条样本
2015/07/03 职场文书
大一新生军训新闻稿
2015/07/17 职场文书
2016十一国庆节感言
2015/12/09 职场文书
JavaScript流程控制(循环)
2021/12/06 Javascript
netty 实现tomcat的示例代码
2022/06/05 Servers