多个数据库连接

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');
    }
}