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 相关文章推荐
ThinkPHP采用模块和操作分析
Apr 18 PHP
Codeigniter(CI)框架分页函数及相关知识
Nov 03 PHP
PHP自带ZIP压缩、解压缩类ZipArchiv使用指南
Mar 03 PHP
php实现向javascript传递数组的方法
Jul 27 PHP
两款万能的php分页类
Nov 12 PHP
php封装的连接Mysql类及用法分析
Dec 10 PHP
PHP版单点登陆实现方案的实例
Nov 17 PHP
PHP实现的统计数据功能详解
Dec 06 PHP
使用PHP json_decode可能遇到的坑与解决方法
Aug 03 PHP
Laravel 加载第三方类库的方法
Apr 20 PHP
PHP折半(二分)查找算法实例分析
May 12 PHP
laravel 实现设置时区的简单方法
Oct 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程序中的常见漏洞进行攻击(下)
2006/10/09 PHP
将时间以距今多久的形式表示,PHP,js双版本
2012/09/25 PHP
php批量删除操作(数据访问)
2017/05/23 PHP
php表单习惯用的正则表达式
2017/10/11 PHP
建立良好体验度的Web注册系统ajax
2007/07/09 Javascript
js查找父节点的简单方法
2008/06/28 Javascript
js模拟弹出效果代码修正版
2008/08/07 Javascript
javascript new后的constructor属性
2010/08/05 Javascript
JavaScript.The.Good.Parts阅读笔记(一)假值与===运算符
2010/11/16 Javascript
node.js中的fs.writeFile方法使用说明
2014/12/14 Javascript
jQuery中replaceAll()方法用法实例
2015/01/16 Javascript
jQuery操作DOM之获取表单控件的值
2015/01/23 Javascript
学习JavaScript设计模式(策略模式)
2015/11/26 Javascript
AngularJS整合Springmvc、Spring、Mybatis搭建开发环境
2016/02/25 Javascript
基于JS实现的随机数字抽签实例
2016/12/08 Javascript
URL中“#” “?” &“”号的作用浅析
2017/02/04 Javascript
运用jQuery写的验证表单(实例讲解)
2017/07/06 jQuery
浅谈mint-ui loadmore组件注意的问题
2017/11/08 Javascript
详解Vue项目在其他电脑npm run dev运行报错的解决方法
2018/10/29 Javascript
vue动态添加路由addRoutes之不能将动态路由存入缓存的解决
2019/02/19 Javascript
简述Vue中容易被忽视的知识点
2019/12/09 Javascript
Python获取apk文件URL地址实例
2013/11/01 Python
python中合并两个文本文件并按照姓名首字母排序的例子
2014/04/25 Python
python实现的简单抽奖系统实例
2015/05/22 Python
python中zip()方法应用实例分析
2016/04/16 Python
基于Python批量生成指定尺寸缩略图代码实例
2019/11/20 Python
Python底层封装实现方法详解
2020/01/22 Python
python实现ftp文件传输功能
2020/03/20 Python
Python Tricks 使用 pywinrm 远程控制 Windows 主机的方法
2020/07/21 Python
Python使用sys.exc_info()方法获取异常信息
2020/07/23 Python
css3中background新增的4个新的相关属性用法介绍
2013/09/26 HTML / CSS
美国鞋类购物网站:Shiekh Shoes
2016/08/21 全球购物
幼儿园儿童节活动主持词+串词大全
2014/03/21 职场文书
2015年七七事变78周年纪念活动方案
2015/05/06 职场文书
2016同学毕业寄语大全
2015/12/04 职场文书
简单谈谈Python面向对象的相关知识
2021/06/28 Python