我有一个中间件,它可以动态更改数据库配置,如下所示:
config(['database.connections.mysql.database'=> 'newDatabaseName']);
在每个模型中,我都显式地设置了$connection = 'mysql'
。
我的模型构造函数内部:
logger()->info(get_class($this). ' database: ' . config('database.connections.mysql.database'));
logger()->info(get_class($this). ' database: ' . DB::connection($this->connection)->getDatabaseName());
输出为:
newDatabaseName
oldDatabaseName
其中newDatabaseName
是我在中间件中设置的数据库,oldDatabasename
是.env数据库名称。
因此,基本上我成功地在配置中设置了数据库名称,但由于某种原因,模型仍然使用.env数据库名称。
你知道为什么会这样吗?
我有其他应用于这些路线的中间件:
SubstituteBindings::class,
ChangeLocale::class,
HandleCors::class,
我以为这是因为"SubstituteBinding"中间件,但我试着把我的中间件放在它之前和之后,这没有什么区别。
我正在使用laravel 5.6
您可以动态设置数据库。这将覆盖.evn
和config/database.php
文件。
class MyMiddleware
{
public function handle($request, Closure $next)
{
Config::set('database.connections.mysql.database', $request->path());
return $next($request);
}
}
内核
class Kernel extends HttpKernel
{
/**
* The application's global HTTP middleware stack.
*
* These middleware are run during every request to your application.
*
* @var array
*/
protected $middleware = [
MyMiddleware::class,
AppHttpMiddlewareTrustProxies::class,
FruitcakeCorsHandleCors::class,
AppHttpMiddlewareCheckForMaintenanceMode::class,
IlluminateFoundationHttpMiddlewareValidatePostSize::class,
AppHttpMiddlewareTrimStrings::class,
IlluminateFoundationHttpMiddlewareConvertEmptyStringsToNull::class,
];
现在测试一下!如果您有两个数据库laravel
和stTest
。用户表中的名称字段也是stTest
和laravel
。
Route::get('/stTest', function () {
return User::first()->name; //stTest
});
Route::get('/laravel', function () {
return User::first()->name; //laravel
});
Laravel在启动应用程序时获取并存储数组中的配置。
当应用程序启动时,它会读取数据库配置,并根据您将在中间件中覆盖的配置启动数据库连接。因此,更新数据库连接配置不会影响连接本身。
解决方案:
在config/database.php
中定义多个连接,然后在中间件中设置默认连接名称,而不是设置数据库名称。
config(['database.default' => $connectionName]);
当然,不要在模型中显式地设置连接名称。
我终于发现了发生了什么。DatabaseManager第一次缓存所有连接,这将修复它:
config(['database.connections.mysql.database' => 'newDatabaseName']);
DB::purge('mysql');
DB::reconnect('mysql');
以下是我发现的关于确切问题的帖子:https://divinglaravel.com/understanding-how-laravel-configures-database-connections