Laravelで複数のデータベースを使用する方法

受付中 プログラミング
2024-12-24
筋肉エンジニア
システム内の複数のデータベースを結合したい。ほとんどの場合、データベースはMySQLです。ただし、将来的には異なる可能性があります。つまり、管理者は、異種データベースシステムのソースを使用するようなレポートを生成できます。
だから私の質問は、Laravelはそのような状況に対処するためのファサードを提供していますか?または、他のフレームワークには、問題に対してより適切な機能がありますか?
回答一覧
\n

.env> = 5.0を使用(5.5でテスト済み)( 8で動作)
.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'), ],

※ DB_usernamemysql2とDB_passwordが同じ場合はenv('DB_USERNAME')、.env最初の数行に記載されているものを使用できます。

■ .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; }
}

※ データベース間でテーブルとの関係を構築しようとする場合は注意が必要です。実行することは可能ですが、いくつかの注意点があり、使用しているデータベースやデータベース設定によって異なります。

LaravelDocsの場合 .env> = 5.0を使用(5.5でテスト済み)( 8で動作) の.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'), ],

注: DB_usernamemysql2とDB_passwordが同じ場合はenv('DB_USERNAME')、.env最初の数行に記載されているものを使用できます。
.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; }
}
注データベース間でテーブルとの関係を構築しようとする場合は注意が必要です。実行することは可能ですが、いくつかの注意点があり、使用しているデータベースやデータベース設定によって異なります。
LaravelDocsから 複数のデータベース接続の使用
複数の接続を使用する場合は、ファサードconnectionの接続方法を介してそれぞれにアクセスできます。メソッドに渡されるのはDB、構成ファイルにリストされている接続の1つに対応している必要があります。nameconnectionconfig/database.php
$users = DB::connection('foo')->select(...);
接続インスタンスでgetPdoメソッドを使用して、基になる生のPDOインスタンスにアクセスすることもできます。 $pdo = DB::connection()->getPdo();
筋肉エンジニア
Laravel 5.1では、接続を指定します。 $users = DB::connection('foo')->select(...); デフォルトでは、Laravelはデフォルトの接続を使用します。簡単ですね。 詳細はこちら: http: //laravel.com/docs/5.1/database#accessing-connections
筋肉エンジニア
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のテーブル用にさらに多くのモデルを作成できます。
筋肉エンジニア
'name'は二重引用符で囲む必要があるため、実際にDB::connection('name')->select(..)は機能しません: "name" それでも、selectクエリはデフォルトの接続で実行されます。まだ理解しようとしていますが、Laravelに意図したとおりに機能するように説得する方法:接続を変更します。 編集:私はそれを理解しました。Laravels DatabaseManagerをデバッグした後、私のdatabase.php(構成ファイル)($ this-> app内)が間違っていることが判明しました。「接続」のセクションには、「データベース」のようなものがあり、コピー元の値が含まれています。明確に言えば、代わりに env('DB_DATABASE', 'name') 私は次のようなものを配置する必要がありました 'myNewName' すべての接続がデータベース、ユーザー名、パスワードなどに同じ値でリストされているため、少なくとも別のデータベース名にアクセスしたい場合はもちろんほとんど意味がありません したがって、別のデータベースから何かを選択するたびに、常にデフォルトのデータベースになりました。
筋肉エンジニア
また、postgresfdwシステムを使用できます https://www.postgresql.org/docs/9.5/postgres-fdw.html postgresで別のデータベースに接続できるようになります。その後、1つのクエリで、異なるデータベースにあるテーブルにアクセスできます。
筋肉エンジニア
既存のシステムのクローンを作成し、新しい顧客のために新しいデータベースで既存のコードを実行する場合は、適切なソリューションではありません。 DB :: connection('foo')を挿入するには、何百もの雄弁な呼び出しを編集する必要があります。
筋肉エンジニア