引言
在鞏固了基礎知識之后,我們把目標轉向框架的學習。Laravel 是一個全球流行的框架,開發(fā)者和使用者都比較活躍,周邊有許多庫,和第三方資源均提供了支持。

今天說一下,如何在框架里同時連接多個數據庫?
學習時間
為什么需要連接多個數據庫呢?因為,應用程序和數據庫有可能不在同一臺服務器。而數據庫服務器,并不能包含所有的業(yè)務表。所以經過拆分的數據庫需要我們建立多個連接。
一般我們在 .env 文件內指定本地或者線上使用的配置項。這樣做比較靈活,很容易區(qū)分出不同的設置。
首先我們在 .env 文件內添加如下配置:
DB_CONNECTION=MySQL
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=database1
DB_USERNAME=root
DB_PASSword=secret
DB_CONNECTION_SECOND=mysql
DB_HOST_SECOND=127.0.0.1
DB_PORT_SECOND=3306
DB_DATABASE_SECOND=database2
DB_USERNAME_SECOND=root
DB_PASSWORD_SECOND=secret
當然 DB_HOST 可以是任何遠程的數據庫,或者本地的數據庫資源。有多少個,就需要手動定義多少個,只是把常量加以區(qū)分,以便在程序內讀取。
接著在配置目錄數據庫配置項 config/database.php 內添加這些連接:
'mysql' => [
'driver' => env('DB_CONNECTION'),
'host' => env('DB_HOST'),
'port' => env('DB_PORT'),
'database' => env('DB_DATABASE'),
'username' => env('DB_USERNAME'),
'password' => env('DB_PASSWORD'),
],
'mysql2' => [
'driver' => env('DB_CONNECTION_SECOND'),
'host' => env('DB_HOST_SECOND'),
'port' => env('DB_PORT_SECOND'),
'database' => env('DB_DATABASE_SECOND'),
'username' => env('DB_USERNAME_SECOND'),
'password' => env('DB_PASSWORD_SECOND'),
],
其中 “mysql”和“mysql2”就是數據庫連接 $connection 的別名,用以區(qū)分不同的資源。如果方便記憶,可以使用諸如 “mysql_server_a”"mysql_server_b" 這樣的符號。
數據庫操作
如果你遵循框架的數據庫操作方式,首先是進行表的遷移,那么創(chuàng)建在 migrations 內,指定給哪個數據庫創(chuàng)建表,則需要這樣寫:
Schema::connection('mysql2')->create('some_table', function($table)
{
$table->increments('id');
});
對于查詢操作,使用原生的方式,需要明確指定從某個連接操作sql,需要這樣寫:
$users = DB::connection('mysql2')->select(...);
當然了,我們不推薦在程序內進行原生sql操作,因為這樣破壞了數據庫表字段的可追溯性,也喪失了 Eloquent ORM 的強大功能。
所以我們使用模型操作數據庫,那么指定某個 Model 使用哪個數據庫的哪個表,只需要在模型文件內顯式聲明:
class SomeModel extends Model
{
protected $connection = 'mysql2';
}
這樣,程序內對于 SomeModel 的所有操作就都是針對 “mysql2”這個連接所指向的數據庫。
Laravel 的靈活還不止這一點半點,如果在Model內不指定$connection,你還可以在控制器內,在命令行程序內,在隊列內,在中間件內,在監(jiān)聽器內,都可以任意指定某個Model連接:
class SomeController extends BaseController {
public function someMethod()
{
$someModel = new SomeModel;
$someModel->setConnection('mysql2'); // 非靜態(tài)方法
$something = $someModel->find(1);
$something = SomeModel::on('mysql2')->find(1); // 靜態(tài)方法
return $something;
}
}
這樣優(yōu)雅靈活的用法,有沒有眼前一亮!
寫在最后
本文通過多種方法,演示了Laravel從數據庫連接配置,到程序內使用的方方面面。還沒有體驗這個框架的同學,你真的值得一試了。