有時候我們再使用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中再配置個數據庫使用配置名引用。