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 相关文章推荐
玩转图像函数库―常见图形操作
Sep 03 PHP
简单的页面缓冲技术
Oct 09 PHP
第十五节--Zend引擎的发展
Nov 16 PHP
php 图片加水印与上传图片加水印php类
May 12 PHP
zend framework文件上传功能实例代码
Dec 25 PHP
PHP+redis实现添加处理投票的方法
Nov 14 PHP
php数组冒泡排序算法实例
May 06 PHP
PHP实现动态压缩js与css文件的方法
May 02 PHP
ThinkPHP5.0框架结合Swoole开发实现WebSocket在线聊天案例详解
Apr 02 PHP
php + WebUploader实现图片批量上传功能
May 06 PHP
PHP实现时间日期友好显示实现代码
Sep 08 PHP
有关PHP 中 config.m4 的探索
Aug 26 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
浅析PHP的ASCII码转换类
2013/07/05 PHP
php+ajax导入大数据时产生的问题处理
2014/06/11 PHP
将酷狗krc歌词解析并转换为lrc歌词php源码
2014/06/20 PHP
php好代码风格的阶段性总结
2016/06/25 PHP
PHP实现留言板功能的详细代码
2017/03/25 PHP
jQuery.autocomplete 支持中文输入(firefox)修正方法
2011/03/10 Javascript
Jquery之Ajax运用 学习运用篇
2011/09/26 Javascript
页面使用密码保护代码
2013/04/10 Javascript
jquery获取自定义属性(attr和prop)实例介绍
2013/04/21 Javascript
jQuery中bind,live,delegate与one方法的用法及区别解析
2013/12/30 Javascript
SeaJS入门教程系列之完整示例(三)
2014/03/03 Javascript
JS对字符串编码的几种方式使用指南
2015/05/14 Javascript
jquery彩色投票进度条简单实例演示
2020/07/23 Javascript
谈谈js中的prototype及prototype属性解释和常用方法
2015/11/25 Javascript
JS简单实现获取元素的封装操作示例
2017/04/07 Javascript
vue实现todolist单页面应用
2017/04/11 Javascript
判断iOS、Android以及PC端的示例代码
2018/11/15 Javascript
微信小程序实现下拉框功能
2019/07/16 Javascript
详解Angular cli配置过程记录
2019/11/07 Javascript
python 3.7.0 下pillow安装方法
2018/08/27 Python
将pip源更换到国内镜像的详细步骤
2019/04/07 Python
Python 3.8 新功能大揭秘【新手必学】
2020/02/05 Python
Python configparser模块应用过程解析
2020/08/14 Python
浅谈Python __init__.py的作用
2020/10/28 Python
野兽派官方旗舰店:THE BEAST 野兽派
2016/08/05 全球购物
波兰在线体育用品商店:Hop-Sport.pl
2019/07/23 全球购物
马来西亚网上花店:FlowerAdvisor马来西亚
2020/01/03 全球购物
优秀教师事迹简介
2014/02/02 职场文书
预备党员的自我评价
2014/03/12 职场文书
自我管理的活动方案
2014/08/25 职场文书
运动会广播稿诗歌版
2014/09/12 职场文书
2014年环境卫生工作总结
2014/11/24 职场文书
原料仓管员岗位职责
2015/04/01 职场文书
用Python将库打包发布到pypi
2021/04/13 Python
超详细Python解释器新手安装教程
2021/05/10 Python
浅谈Python实现opencv之图片色素的数值运算和逻辑运算
2021/06/23 Python