サーチ…
複数のデータベース接続
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 Model
Eloquentを使用してデータベース接続を指定するには、 $connection
プロパティを定義する必要があります。
namespace App\Model\Sqlite;
class Table extends Model
{
protected $table="table";
protected $connection = 'sqlite';
}
Eloquentを使用して別の(2番目の)データベース接続を指定するには:
namespace App\Model\MySql;
class Table extends Model
{
protected $table="table";
protected $connection = 'mysql';
}
Laravelは、 config/database.php
定義された指定された接続を利用するために、モデルで定義された$connection
プロパティを使用しconfig/database.php
。 $connection
プロパティがモデルで定義されていない場合、デフォルトが使用されます。
static 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');
}
}