Laravel 5.3 - 如何跨多个数据库执行查询?

时间:2017-02-15 06:21:53

标签: php mysql laravel laravel-5

我们目前有多个数据库位于不同的地方。它们的结构完全相同。由于某些法律规定,我们这样做而不是分区(对于大多数时代,我们只对其中一个进行查询)。

但有时我们需要做跨数据库的事情,我们可以根据请求知道要查询的数据库。我知道这可以通过每个API中的循环来完成,但这会相当难看,我想要一种编程方式(我们有许多API可能会获得跨数据库查询)。

例如,可能有类似的内容:

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

2 个答案:

答案 0 :(得分:0)

如果根据请求选择数据库,我会选择中间件,即:

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

答案 1 :(得分: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,
],

对region2执行相同操作。

现在扩展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等方法。

这些都不起作用,它只是一个快速草案。我想你知道我在这里想要实现的目标。这是你要找的东西吗?