我们目前有多个数据库位于不同的地方。它们的结构完全相同。由于某些法律规定,我们这样做而不是分区(对于大多数时代,我们只对其中一个进行查询)。
但有时我们需要做跨数据库的事情,我们可以根据请求知道要查询的数据库。我知道这可以通过每个API中的循环来完成,但这会相当难看,我想要一种编程方式(我们有许多API可能会获得跨数据库查询)。
例如,可能有类似的内容:
$batchModel = new Batch();
// an array instead of a string here
$batchModel->setConnection(['region1', 'region2']);
$batchModel->all();
答案 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;
}
然后我认为您可以在该集合上调用all
和find
等方法。
这些都不起作用,它只是一个快速草案。我想你知道我在这里想要实现的目标。这是你要找的东西吗?