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
如何使用脚本模仿登陆过程
Nov 22 PHP
PHP 服务器配置(使用Apache及IIS两种方法)
Jun 01 PHP
php 魔术方法使用说明
Oct 20 PHP
php 仿Comsenz安装效果代码打包提供下载
May 09 PHP
探讨php define()函数及defined()函数使用详解
Jun 09 PHP
深入解析PHP中逗号与点号的区别
Aug 05 PHP
分享一个php 的异常处理程序
Jun 22 PHP
php中strlen和mb_strlen用法实例分析
Nov 12 PHP
php+mysql实现简单登录注册修改密码网页
Nov 30 PHP
php输出图像的方法实例分析
Feb 16 PHP
关于php支持的协议与封装协议总结(推荐)
Nov 17 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/03/03 咖啡文化
PHP 遍历文件实现代码
2011/05/04 PHP
php设计模式 Chain Of Responsibility (职责链模式)
2011/06/26 PHP
在SAE上搭建最新wordpress的方法
2014/12/21 PHP
浅谈PHP中的Trait使用方法
2019/03/22 PHP
PHP中将一个字符串部分字符用星号*替代隐藏的实现代码
2019/09/08 PHP
PHP unset函数原理及使用方法解析
2020/08/14 PHP
javascript prototype原型操作笔记
2009/12/07 Javascript
jquery.boxy插件的iframe扩展代码
2010/07/02 Javascript
js动态添加删除,后台取数据(示例代码)
2013/11/25 Javascript
用js来刷新当前页面保留参数的具体实现
2013/12/23 Javascript
js给页面加style无效果的解决方法
2014/01/20 Javascript
js拼接html注意问题示例探讨
2014/07/14 Javascript
JS字符串的切分用法实例
2016/02/22 Javascript
js实现StringBuffer的简单实例
2016/09/02 Javascript
JQuery 动态生成Table表格实例代码
2016/12/02 Javascript
详解vue服务端渲染浏览器端缓存(keep-alive)
2018/10/12 Javascript
浅谈Python中带_的变量或函数命名
2017/12/04 Python
python读取和保存图片5种方法对比
2018/09/12 Python
django-filter和普通查询的例子
2019/08/12 Python
Python简易计算器制作方法代码详解
2019/10/31 Python
Django 创建后台,配置sqlite3教程
2019/11/18 Python
python中的 zip函数详解及用法举例
2020/02/16 Python
Python实现封装打包自己写的代码,被python import
2020/07/12 Python
Python实现Canny及Hough算法代码实例解析
2020/08/06 Python
python 如何快速复制序列
2020/09/07 Python
Python下载的11种姿势(小结)
2020/11/18 Python
Finishline官网:美国一家领先的运动品牌鞋类、服装零售商
2016/07/20 全球购物
瑞士灯具购物网站:Lampenwelt.ch
2018/07/08 全球购物
卡骆驰德国官方网站:Crocs德国
2019/03/29 全球购物
毕业生个人投资创业计划书
2014/01/04 职场文书
残疾人小组计划书
2014/04/27 职场文书
共青团员自我评价范文
2014/09/14 职场文书
老人再婚离婚协议书范本
2014/10/27 职场文书
2014年仓库管理工作总结
2014/12/17 职场文书
详细聊聊关于Mysql联合查询的那些事儿
2021/10/24 MySQL