首页 > 解决方案 > 在 Laravel 中动态配置数据库连接

问题描述

在 Laravel 8 中,我试图在两种情况下设置动态连接:

  1. 登录后,根据用户设置自定义数据库连接。

在这种情况下,登录后,我在中间件中调用一个方法:

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;
}

这很完美,连接也很完美。

  1. 我需要在工作中运行一些进程。所以我需要访问每个用户数据库,我尝试执行相同的过程,但我不断收到错误消息:

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 ... 为空)

有什么想法吗?,我猜在工作中,因为它在控制台中运行,所以程序不同?

标签: laravelcronlaravel-8laravel-jobs

解决方案


Laravel 一个域,Session 检测到多个数据库

几年前我遇到了同样的问题,这是我的解决方案,另外,如果您需要即时切换连接:

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');

推荐阅读