私は自分のシステムに複数のデータベースを結合したいのです。ほとんどの場合、データベースはMySQLです。しかし、将来は異なる可能性があります。つまり、管理者は、異種データベースシステムの使用元であるレポートを生成できます。
それで私の質問はLaravelはそのような状況に対処するためのファサードを提供しますか?それとも他のフレームワークが問題に適した機能を持っているのでしょうか?
.env
> = 5.0の使用 (5.5でテスト済み).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
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'),
],
注:
mysql2
では、DB_usernameとDB_passwordが同じ場合、.env
の最初の数行で説明されているenv('DB_USERNAME')
を使用できます。
.env
<5.0なし接続を定義する
app/config/database.php
return array(
'default' => 'mysql',
'connections' => array(
# Primary/Default database connection
'mysql' => array(
'driver' => 'mysql',
'Host' => '127.0.0.1',
'database' => 'database1',
'username' => 'root',
'password' => 'secret'
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
),
# Secondary database connection
'mysql2' => array(
'driver' => 'mysql',
'Host' => '127.0.0.1',
'database' => 'database2',
'username' => 'root',
'password' => 'secret'
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
),
),
);
スキーマ
使用する接続を指定するには、単にconnection()
メソッドを実行します。
Schema::connection('mysql2')->create('some_table', function($table)
{
$table->increments('id'):
});
クエリビルダー
$users = DB::connection('mysql2')->select(...);
説得力がある
モデルに$connection
変数を設定します
class SomeModel extends Eloquent {
protected $connection = 'mysql2';
}
実行時にsetConnection
メソッドまたはon
静的メソッドを介して接続を定義することもできます。
class SomeController extends BaseController {
public function someMethod()
{
$someModel = new SomeModel;
$someModel->setConnection('mysql2'); // non-static method
$something = $someModel->find(1);
$something = SomeModel::on('mysql2')->find(1); // static method
return $something;
}
}
注データベース間でテーブルとの関係を構築しようとする際は注意してください。それは可能ですが、いくつか注意点があり、どのデータベースやデータベース設定に依存しているかによって異なります。
複数のデータベース接続を使用する
複数の接続を使用する場合は、connection
ファサードの接続方法で各DB
にアクセスできます。 name
メソッドに渡されるconnection
は、config/database.php
構成ファイルにリストされている接続の1つに対応している必要があります。 :
$users = DB::connection('foo')->select(...);
接続インスタンスでgetPdoメソッドを使用して、生の基礎となるPDOインスタンスにアクセスすることもできます。
$pdo = DB::connection()->getPdo();
便利なリンク
laracasts.com
tutsnare.com
から複数のデータベースを接続するfideloper.com
の複数のDB接続Laravel 5.1では、接続を指定します。
$users = DB::connection('foo')->select(...);
デフォルト、Laravelはデフォルトの接続を使用します。簡単ですね。
ここでもっと読んでください: http://laravel.com/docs/5.1/database#accessing-connections
'name'は二重引用符で囲む必要があるため、実際にはDB::connection('name')->select(..)
は私には機能しません: "name"
それでも、selectクエリは私のデフォルト接続で実行されます。それでも、Laravelが意図したとおりに動作するように説得する方法を見つけようとしています。接続を変更します。
編集:私はそれを考え出した。 Laravels DatabaseManagerをデバッグした後、私のdatabase.php(設定ファイル)($ this-> appの中)が間違っていたことがわかりました。 「接続」セクションでは、「データベース」のようなものをコピー元の値で持っていました。明確な言葉ではなく、
env('DB_DATABASE', 'name')
私は何かを配置する必要がありました
'myNewName'
データベース、ユーザー名、パスワードなどのすべての接続が同じ値でリストされているので、少なくとも別のデータベース名にアクセスしたい場合は、もちろんこれはほとんど意味がありません。
したがって、別のデータベースから何かを選択したいと思うたびに、私はいつも私のデフォルトデータベースに行き着きました。
Laravelは複数のデータベースサステムをサポートしています。あなたが必要とするのはconfig/database.phpファイルに接続の詳細を提供することだけです。
return [
'default' => env('DB_CONNECTION', 'mysql'),
'connections' => [
'mysql' => [
'driver' => 'mysql',
'Host' => env('DB_Host', '127.0.0.1'),
'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,
],
'mysqlOne' => [
'driver' => 'mysql',
'Host' => env('DB_Host_ONE', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE_ONE', 'forge'),
'username' => env('DB_USERNAME_ONE', 'forge'),
'password' => env('DB_PASSWORD_ONE', ''),
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'strict' => false,
'engine' => null,
],
];
これを取得したら、各接続に対して2つの基本モデルクラスを作成し、それらのモデルで接続名を定義できます。
//BaseModel.php
protected $connection = 'mysql';
//BaseModelOne.php
protected $connection = 'mysqlOne';
これらのモデルを拡張して、各DB内のテーブルに対してより多くのモデルを作成できます。