laravel - 在 Laravel 中动态配置数据库连接
问题描述
在 Laravel 8 中,我试图在两种情况下设置动态连接:
- 登录后,根据用户设置自定义数据库连接。
在这种情况下,登录后,我在中间件中调用一个方法:
public static function changeConnection($customerId)
{
$database = Database::where('customer_id', '=', $customerId)->first();
if (empty($database)) {
return null;
}
$connectionName = 'customer';
$config = Config::get('database.connections.' . $connectionName);
$config = [
'driver' => 'mysql',
'host' => $database->database_host,
'port' => $database->database_port,
'database' => $database->database_name,
'username' => $database->database_username,
'password' => $database->database_password
];
config()->set('database.connections.' . $connectionName, $config);
DB::purge($connectionName);
return $connectionName;
}
这很完美,连接也很完美。
- 我需要在工作中运行一些进程。所以我需要访问每个用户数据库,我尝试执行相同的过程,但我不断收到错误消息:
local.ERROR: SQLSTATE[HY000] [2002] 没有这样的文件或目录(SQL:select ... 为空){“异常”:“[对象](Illuminate\Database\QueryException(代码:2002):SQLSTATE[HY000 ] [2002] /app/vendor/laravel/framework/src/Illuminate/Database/Connection.php:671 中没有这样的文件或目录(SQL:select ... 为空)
有什么想法吗?,我猜在工作中,因为它在控制台中运行,所以程序不同?
解决方案
几年前我遇到了同样的问题,这是我的解决方案,另外,如果您需要即时切换连接:
config(
[
'database.connections.tenant' =>
[
'driver' => 'mysql',
'host' => 'localhost',
'port' => 3306,
'database' => 'the_database_name',
'username' => env('DB_USERNAME'),
'password' => env('DB_PASSWORD'),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
],
]);
$data = DB::connection('tenant')->select('Your sql');
推荐阅读
- javascript - 如何在谷歌地图中的标记上打开信息窗口反应地图 div 外列表项的 Onclick?
- python-3.x - 将具有多个页面的多个 .pdf 文件转换为 1 个单个 .csv 文件
- javascript - 日出/设置时间无效?
- javascript - 我如何使 javascript 在 WordPress 中工作?
- javascript - 多个 y 轴上的 HighStocks 注释
- javascript - React.js 对话框组件消失但仍保留在 DOM 中
- r - 问题:两组的 Kruskal-Wallis 检验
- python - 如何在python中捕获异常消息?
- wpf - 如何在 MahApps.Metro.Controls 窗体的子窗口中添加 WPF Web 浏览器
- python - 我正在尝试使用 python 3 而不是 python 2