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 相关文章推荐
新闻分类录入、显示系统
Oct 09 PHP
PHP3 safe_mode 失效漏洞
Oct 09 PHP
利用static实现表格的颜色隔行显示
Oct 09 PHP
PHP写入WRITE编码为UTF8的文件的实现代码
Jul 07 PHP
PHP中操作ini配置文件的方法
Apr 25 PHP
php导出word格式数据的代码实例
Nov 25 PHP
CentOS6.5 编译安装lnmp环境
Dec 21 PHP
php数组索引与键值操作技巧实例分析
Jun 24 PHP
php实现递归的三种基本方式
Jul 04 PHP
PHP的中使用非缓冲模式查询数据库的方法
Feb 05 PHP
ThinkPHP中create()方法自动验证实例
Apr 26 PHP
php分页查询mysql结果的base64处理方法示例
May 18 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
2021年最新CPU天梯图
2021/03/04 数码科技
java EJB 加密与解密原理的一个例子
2008/01/11 PHP
基于PHP静态类的原罪详解
2013/05/06 PHP
解析zend studio中直接导入svn中的项目的方法步骤
2013/06/21 PHP
php获取qq用户昵称和在线状态(实例分析)
2013/10/27 PHP
Laravel timestamps 设置为unix时间戳的方法
2019/10/11 PHP
php如何实现数据库的备份和恢复
2020/11/30 PHP
解密效果
2006/06/23 Javascript
发布一个高效的JavaScript分析、压缩工具 JavaScript Analyser
2007/11/30 Javascript
JQuery扩展插件Validate—4设置错误提示的样式
2011/09/05 Javascript
鼠标滑过出现预览的大图提示效果
2014/02/26 Javascript
JSON中双引号的轮回使用过程中一定要小心
2014/03/05 Javascript
9款2014最热门jQuery实用特效推荐
2014/12/07 Javascript
整理JavaScript创建对象的八种方法
2015/11/03 Javascript
jQuery实现的导航下拉菜单效果示例
2016/09/05 Javascript
Angularjs渲染的 using 指令的星级评分系统示例
2017/11/09 Javascript
玩转vue的slot内容分发
2018/09/22 Javascript
JS canvas绘制五子棋的棋盘
2020/05/28 Javascript
详解Vue组件之间通信的七种方式
2019/04/14 Javascript
在Vue项目中使用snapshot测试的具体使用
2019/04/16 Javascript
前端js中的事件循环eventloop机制详解
2019/05/15 Javascript
windows下安装Python和pip终极图文教程
2017/03/05 Python
python远程邮件控制电脑升级版
2019/05/23 Python
Python列表与元组的异同详解
2019/07/02 Python
tensorflow如何批量读取图片
2019/08/29 Python
Tensorflow限制CPU个数实例
2020/02/06 Python
python如何利用paramiko执行服务器命令
2020/11/07 Python
澳洲本土太阳镜品牌:Quay Australia
2019/07/29 全球购物
什么是抽象
2015/12/13 面试题
我的网上商城创业计划书
2013/12/26 职场文书
环境科学专业教师求职信
2014/07/12 职场文书
党校学习党性分析材料
2014/12/19 职场文书
2016年法制宣传月活动总结
2016/04/01 职场文书
如何让2019年上半年的工作总结更出色!
2019/07/01 职场文书
Go语言基础切片的创建及初始化示例详解
2021/11/17 Golang
如何利用golang运用mysql数据库
2022/03/13 Golang