多个数据库连接
Laravel 允许用户处理多个数据库连接。如果需要连接到多个数据库并使它们协同工作,则需要注意连接设置。
如果需要,还允许在同一应用程序中使用不同类型的数据库。
默认连接在 config/database.php
中,你可以看到配置项调用:
'default' => env('DB_CONNECTION', 'mysql'),
此名称引用下面的连接名称 mysql
:
'connections' => [
'sqlite' => [
'driver' => 'sqlite',
'database' => database_path('database.sqlite'),
'prefix' => '',
],
'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', 'localhost'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'strict' => false,
'engine' => null,
],
],
如果你未在其他代码或命令中提及数据库连接的名称,Laravel 将选择默认的数据库连接名称。但是,在多个数据库连接中,即使你设置了默认连接,也可以更好地设置你使用的数据库连接。
迁移文件
在迁移文件中,如果是单个数据库连接,则可以使用:
Schema::create("table",function(Blueprint $table){
$table->increments('id');
});
在多数据库连接中,你将使用 connection()
方法告诉 Laravel 你使用的数据库连接:
Schema::connection("sqlite")->create("table",function(Blueprint $table){
$table->increments('id');
});
工匠移民
如果使用单个数据库连接,则将运行:
php artisan migrate
但是,对于多个数据库连接,你最好告诉哪个数据库连接维护迁移数据。所以你将运行以下命令:
php artisan migrate:install --database=sqlite
此命令将在目标数据库中安装迁移表以准备迁移。
php artisan migrate --database=sqlite
此命令将运行迁移并将迁移数据保存在目标数据库中
php artisan migrate:rollback --database=sqlite
此命令将回滚迁移并将迁移数据保存在目标数据库中
雄辩的模型
要使用 Eloquent 指定数据库连接,你需要定义 $connection
属性:
namespace App\Model\Sqlite;
class Table extends Model
{
protected $table="table";
protected $connection = 'sqlite';
}
使用 Eloquent 指定另一个(第二个)数据库连接:
namespace App\Model\MySql;
class Table extends Model
{
protected $table="table";
protected $connection = 'mysql';
}
Laravel 将使用模型中定义的 $connection
属性来利用 config/database.php
中定义的指定连接。如果未在模型中定义 $connection
属性,则将使用默认值。
你还可以使用静态 on
方法指定另一个连接:
// Using the sqlite connection
Table::on('sqlite')->select(...)->get()
// Using the mysql connection
Table::on('mysql')->select(...)->get()
数据库/查询生成器
你还可以使用查询构建器指定另一个连接:
// Using the sqlite connection
DB::connection('sqlite')->table('table')->select(...)->get()
// Using the mysql connection
DB::connection('mysql')->table('table')->select(...)->get()
单元测试
Laravel 提供 seeInDatabase($table,$fielsArray,$connection)
来测试数据库连接代码。在单元测试文件中,你需要执行以下操作:
$this
->json(
'GET',
'result1/2015-05-08/2015-08-08/a/123'
)
->seeInDatabase("log", ["field"=>"value"], 'sqlite');
通过这种方式,Laravel 将知道要测试的数据库连接。
单元测试中的数据库事务
Laravel 允许数据库在测试期间回滚所有更改。要测试多个数据库连接,需要设置 $connectionsToTransact
属性
use Illuminate\Foundation\Testing\DatabaseMigrations;
class ExampleTest extends TestCase
{
use DatabaseTransactions;
$connectionsToTransact =["mysql","sqlite"] //tell Laravel which database need to rollBack
public function testExampleIndex()
{
$this->visit('/action/parameter')
->see('items');
}
}