2017-02-15 17 views
3

現在、異なる場所に物理的に配置された複数のデータベースがあります。それらの構造はまったく同じです。我々はいくつかの法規制のためにパーティショニングするのではなく、これを行います(のほとんどはです)。Laravel 5.3 - 複数のデータベース間でクエリを実行する方法

ただし、クロスデータベースの処理が必要な場合があり、リクエストに基づいて照会するデータベースを知ることができます。私は、これは各APIのループで行うことができますが、それはむしろ醜いだろうと私はプログラム的な方法(私たちは潜在的にクロスデータベースクエリを得ることができるいくつかのAPIを持っている)が欲しいです。あなたは、私がミドルウェアすなわちのために行くだろう要求に基づいて、データベースを選択した場合は

$batchModel = new Batch(); 
// an array instead of a string here 
$batchModel->setConnection(['region1', 'region2']); 
$batchModel->all(); 

答えて

0

興味深い...限りとして、私はLaravelがこれをネイティブにサポートしていないことを知っています。

私はこの作品を作るための方法を考えることができます。

あなたの.envファイルに複数のデータベースを作成することができます。

DB_CONNECTION=region1 
DB_HOST=adomain.com 
DB_PORT=3306 
DB_DATABASE=homestead 
DB_USERNAME=homestead 
DB_PASSWORD=secret 

そして、別のものを:

DB_CONNECTION=region2 
DB_HOST=anotherdomain.com 
DB_PORT=3306 
DB_DATABASE=homestead 
DB_USERNAME=homestead 
DB_PASSWORD=secret 

その後追加それはあなたのdatabase config

'region1' => [ 
    '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' => 'utf8mb4', 
    'collation' => 'utf8mb4_unicode_ci', 
    'prefix' => '', 
    'strict' => true, 
    'engine' => null, 
], 

リージョン2と同じことを行います。

は今Eloquentクラスを拡張し、「setMultipleConnections」のようなメソッドを追加します。

public method setMultipleConnections($databases, Model $model) { 

    $collection = new Illuminate\Database\Eloquent\Collection; 
    // Loop over $databases array and for each one of them get the collection. 
    foreach ($databases as $database) { 
     $model = new $model; 
     $model->setConnection($database); 
     $model->get(); 

     $collections->merge($model); 
    } 

    return $collection; 

} 

その後、私はあなたがそのコレクションにallfindのようなメソッドを呼び出すことができると思います。

これはどれも動作しませんが、それは簡単なドラフトです。私はあなたが私がここで達成しようとしていることを知っていると思います。これはあなたが探しているものですか?

+0

はい、これは私が欲しいものです。しかし、私はそれを実装するために適切なものを考え出すことはできません。 –

+0

私がやったやり方は、あなたがそれを実装するための適切な方法ではないでしょうか? –

+0

申し訳ありませんが、「この作品はありません」とはどういう意味ですか? –

0

:たとえば

は、のようなものがあるかもしれない

public function handle($request, Closure $next) 
{   
    if($request->has('something')) { 
     config(['database.default' => $request->something]); 
    } 
    return $next($request); 
} 
+0

あなたは完全に私を誤解しました。私は、すべてのデータベースを通してループを実行する簡潔な方法があるのか​​どうか、デフォルトの方法を設定する方法ではないことを意味しました。 –

+0

あなたは正しく私は問題を完全に誤解している、フレデリック。私はあなたの質問を読んで、私はあなたが求めるものの良い解決策を持っていません。 – dparoli

関連する問題