ThinkPHP3.1新特性之多数据库操作更加完善


Posted in PHP onJune 19, 2014

通常情况下,如果一个应用只是操作同一个数据库(或者分布式数据库)的话,你只需要在项目配置文件中定义数据库连接信息即可。这里说的多数据库操作一般指的是在一个应用中会操作不同的数据库(包括同类型的和不同类型的数据库),甚至包括动态切换多数据库的情况。

对于早期版本的ThinkPHP来说,切换数据库需要使用高级模型,而现在的3.1版本则可以更加轻松的解决了。

新版对多数据的支持有下面几种方式,开发人员可以根据实际情况选择合适的方式操作:

1.模型定义数据库

如果只是简单的跨库操作,并且只是个别模型类的话,你可以直接在模型类中定义dbName属性即可:

protected $dbName = 'top';

实例化的时候,记得要使用D方法,例如:

$User = D('User');

这种方式定义的前提是当前数据库用户账户有操作top数据库的权限。

2.模型定义数据库连接

如果你的跨库操作需要使用不同的数据库连接账号或者需要连接不同类型的数据库,可以直接在模型类里面定义connection属性,在操作该模型类的时候,就会自动连接到指定的数据库。例如:

protected $connection = 'mysql://root:1234@localhost:3306/thinkphp';

或者使用数组方式定义:

protected $connection = array(
  'db_type' => 'mysql',
  'db_user' => 'root',
  'db_pwd'  => '1234',
  'db_host' => 'localhost',
  'db_port' => '3306',
  'db_name' => 'thinkphp'
 );

如果我们已经在配置文件中配置了额外的数据库连接信息,例如:

//数据库配置1
  'DB_CONFIG1' = array(
    'db_type' => 'mysql',
    'db_user' => 'root',
    'db_pwd'  => '1234',
    'db_host' => 'localhost',
    'db_port' => '3306',
    'db_name' => 'thinkphp'
  ),
  //数据库配置2
  'DB_CONFIG2' => 'mysql://root:1234@localhost:3306/thinkphp';

那么,我们可以把模型类的属性定义改为:

//调用配置文件中的数据库配置1
 protected $connection = 'DB_CONFIG1';

或者:

//调用配置文件中的数据库配置2
 protected $connection = 'DB_CONFIG2';

这种方式的优点可以支持不同数据库类型,也就是说可以和当前的项目配置文件中的数据库类型不同,缺点是必须使用D方法实例化,而且不能动态设定。

3.模型实例化指定连接

新版支持在实例化模型的时候指定数据库连接,例如:

$User = new Model('User','think_','mysql://root:1234@localhost/thinkphp');

或者使用M方法实例化:

$User = M('User','think_','mysql://root:1234@localhost/thinkphp');

M方法的第二个参数是数据表的前缀,如果留空表示采用项目配置的数据表前缀,第三个参数则是当前实例化需要的数据库连接信息。

同样的道理,在实例化中传入的数据库连接信息也可以采用配置名称的方式,例如:

$User = M('User','think_','DB_CONFIG2');

如果当前操作不需要切换数据库连接,只是需要切换数据库,则可以采用:

$User = M('top.User','think_');

表示实例化top数据库的think_user数据表。如果你的数据表没有前缀,可以使用

$User = M('top.User',null);

表示实例化top数据库的user表。

4.动态切换连接

系统还提供了更灵活的动态操作,可以使用模型类提供的db方法进行多数据库连接和切换操作,用法:

Model->db("数据库编号","数据库配置");

数据库编号用数字格式,对于已经调用过的数据库连接,是不需要再传入数据库连接信息的,系统会自动记录。对于初始化的数据库连接,内部的数据库编号是0,因此为了避免冲突,请不要再次定义数据库编号为0的数据库配置。

数据库配置的定义方式和模型定义connection属性一样,支持数组、字符串以及调用配置参数三种格式。

Db方法调用后返回当前的模型实例,直接可以继续进行模型的其他操作,所以该方法可以在查询的过程中动态切换,例如:

$this->db(1,"mysql://root:123456@localhost:3306/test")->query("查询SQL");

该方法添加了一个编号为1的数据库连接,并自动切换到当前的数据库连接。

当第二次切换到相同的数据库的时候,就不需要传入数据库连接信息了,可以直接使用:

$this->db(1)->query("查询SQL");

在没有再次进行数据库切换之前,当前的所有操作都是针对db(1)所设置的数据库。
如果需要切换到默认的数据库连接,只需要调用:

$this->db(0);

如果我们已经在项目配置中定义了其他的数据库连接信息,我们就可以直接在db方法中调用配置进行连接了:

$this->db(1,"DB_CONFIG1")->query("查询SQL");
$this->db(2,"DB_CONFIG2")->query("查询SQL");

如果切换数据库之后,数据表和当前不一致的话,可以使用table方法指定要操作的数据表:

$this->db(1)->table("top_user")->find();

如果要返回当前的数据库连接,可以直接调用空的db方法即可,例如:

$db = $this->db();
PHP 相关文章推荐
让你的WINDOWS同时支持MYSQL4,MYSQL4.1,MYSQL5X
Dec 06 PHP
解析PHP函数array_flip()在重复数组元素删除中的作用
Jun 27 PHP
显示程序执行时间php函数代码
Aug 29 PHP
PHP strstr 函数判断字符串是否否存在的实例代码
Sep 28 PHP
php中过滤非法字符的具体实现
Oct 29 PHP
destoon实现调用自增数字从1开始的方法
Aug 21 PHP
php打包网站并在线压缩为zip
Feb 13 PHP
php基于CodeIgniter实现图片上传、剪切功能
May 14 PHP
PHP实现Unicode编码相互转换的方法示例
Nov 17 PHP
PHP基于ICU扩展intl快速实现汉字转拼音及按拼音首字母分组排序的方法
May 03 PHP
PHP使用pdo连接access数据库并循环显示数据操作示例
Jun 05 PHP
PHP中的empty、isset、isnull的区别与使用实例
Mar 22 PHP
ThinkPHP3.1新特性之G方法的使用
Jun 19 #PHP
ThinkPHP3.1新特性之查询条件预处理简介
Jun 19 #PHP
ThinkPHP3.1新特性之字段合法性检测详解
Jun 19 #PHP
ThinkPHP3.1新特性之动态设置自动完成和自动验证示例
Jun 19 #PHP
ThinkPHP的Widget扩展实例
Jun 19 #PHP
ThinkPHP3.1的Widget新用法
Jun 19 #PHP
ThinkPHP3.1新特性之命名范围的使用
Jun 19 #PHP
You might like
什么是调频(FM)、调幅(AM)、短波(SW)、长波(LW)
2021/03/01 无线电
PHP获取数组中某元素的位置及array_keys函数应用
2013/01/29 PHP
PHPExcel导出2003和2007的excel文档功能示例
2017/01/04 PHP
PHP获取当前执行php文件名的代码
2017/03/02 PHP
YII框架批量插入数据的方法
2017/03/18 PHP
tp5.1 框架join方法用法实例分析
2020/05/26 PHP
js 得到文件后缀(通过正则实现)
2013/07/08 Javascript
iframe窗口高度自适应的又一个巧妙实现思路
2014/04/04 Javascript
jQuery实现统计输入文字个数的方法
2015/03/11 Javascript
Bootstrap Table的使用总结
2016/10/08 Javascript
微信小程序中单位rpx和rem的使用
2016/12/06 Javascript
JS正则表达式完美实现身份证校验功能
2017/10/18 Javascript
详谈DOM简介及节点、属性、查找节点的方法
2017/11/16 Javascript
Angular 作用域scope的具体使用
2017/12/11 Javascript
Vue的实例、生命周期与Vue脚手架(vue-cli)实例详解
2017/12/27 Javascript
基于ionic实现下拉刷新功能
2018/05/10 Javascript
vue.js指令v-for使用以及下标索引的获取
2019/01/31 Javascript
解决layui表格的表头不滚动的问题
2019/09/04 Javascript
微信小程序激励式视频广告组件使用详解
2019/12/06 Javascript
Vue发布订阅模式实现过程图解
2020/04/30 Javascript
[01:11:10]2014 DOTA2华西杯精英邀请赛 5 24 iG VS VG加赛
2014/05/26 DOTA
取numpy数组的某几行某几列方法
2018/04/03 Python
python 动态调用函数实例解析
2019/10/21 Python
python使用 cx_Oracle 模块进行查询操作示例
2019/11/28 Python
Python嵌套函数,作用域与偏函数用法实例分析
2019/12/26 Python
通过实例学习Python Excel操作
2020/01/06 Python
Python如何爬取b站热门视频并导入Excel
2020/08/10 Python
在python3.9下如何安装scrapy的方法
2021/02/03 Python
写演讲稿要注意的六件事
2014/01/14 职场文书
校园文化建设方案
2014/02/03 职场文书
《灰椋鸟》教学反思
2014/04/27 职场文书
幼儿园健康教育方案
2014/06/14 职场文书
写给医生的感谢信
2015/01/22 职场文书
go语言基础 seek光标位置os包的使用
2021/05/09 Golang
OpenCV实现反阈值二值化
2021/11/17 Java/Android
Python 的演示平台支持 WSGI 接口的应用
2022/04/20 Python