有时候我们再使用thinkphp时使用command或者多项目的情况下需要使用多个数据库。本案例就是这个问题当然对于单一数据库的操作也会出现这个问题。
使用Db来操作数据库时的误区
因为临时需要更换数据库操作某个表通常会这样来写
Db::connect([
'type' => 'mysql',
'hostname' => '127.0.0.1',
// 数据库名
'database' => 'test',
// 用户名
'username' => 'test',
// 密码
'password' => 'test',
])
但是如果某个方法中使用该连接的地方非常多有人可能会考虑把这个连接初始化赋值给某个变量后边可以拿来用。[这是个误区]
错误代码如下:
$db = Db::connect([
'type' => 'mysql',
'hostname' => '127.0.0.1',
// 数据库名
'database' => 'test',
// 用户名
'username' => 'test',
// 密码
'password' => 'test',
])
$db->table('customer')->where([
['name', '=', '伽马编程'],
['id', '<>', $v['id']]
])->find();
//后续的一连串操作
当然这样写我相信$db变量是要用多次的。看似没问题的写法但是其实是错误的。你会发现你在后续的各种数据库操作都不准确或者错误了,为什么呢?
错误原因
在给$db赋值时要看看connect返回的是什么。
return new $query(self::$connection);
在这儿connect返回的是一个query对象。而在后续操作中用到了where()
return $this->parseWhereExp('AND', $field, $op, $condition, $param);
where调用的parseWhereExp返回的结果是$this,这是链式操作所以。在后续使用where()来操作时其实前边的where条件还在。所以会出现错误的操作。
解决办法
如果真的需要这样操作大家可以把配置数组单独赋值,而不是Db::connect 也可以创建模型来复制protected $connection如果没有必要创建模型的情况下。大家可以再database.php中再配置个数据库使用配置名引用。