【问题标题】:Laravel DB connection not refreshing after changing the config更改配置后 Laravel DB 连接不刷新
【发布时间】:2020-10-03 07:25:50
【问题描述】:

这是我指定的数据库连接。

'mysql_test' => [
          'driver' => 'mysql',
          'host' => env('DB_HOST', '127.0.0.1'),
          'port' => env('DB_PORT', '3306'),
          'database'=> '',
          'username' => env('DB_USERNAME', 'forge'),
          'password' => env('DB_PASSWORD', ''),
          'unix_socket' => env('DB_SOCKET', ''),
          'charset' => 'utf8mb4',
          'collation' => 'utf8mb4_unicode_ci',
          'prefix' => '',
          'prefix_indexes' => true,
          'strict' => true,
          'engine' => null,
      ],

现在我正在尝试从代码中更改database 值,然后像这样连接到数据库

 for( $i = 1; $i <=4 ; $i++)
    {
      $db='test_'.$i;
    DB::connection('mysql_test')->statement('CREATE DATABASE '.$db.';' );

   Config::set('database.connections.mysql_test.database' , $db);
    error_log(config('database.connections.mysql_test.database'));
    DB::reconnect('mysql_test');
    error_log(DB::connection('mysql_test')->getDatabaseName());

  }

config 值与第一个 error_log 一样发生变化,我正在更改 config 值。但是当我用更新的配置再次连接到同一个连接时,我没有得到我的数据库名称。连接未与任何数据库关联。

【问题讨论】:

  • 更改 .env 文件中的数据库值,然后重新启动您的 artisan 服务器,然后检查它是否会更改。
  • 我只想从代码中更改它,并且我没有运行工匠服务器。我已经发出了设置测试数据库的命令。
  • “当我再次连接时”这是什么意思,在什么情况下? ...进程之间不共享运行时更改
  • 我正在重新连接到数据库连接。为什么我们不能在同一进程上连接到不同的数据库连接? @lagabox
  • " 为什么我们不能在同一个进程上连接到不同的数据库连接?"我们可以在同一个进程上连接到不同的连接。

标签: php mysql database laravel laravel-5


【解决方案1】:

您可以尝试purge 连接,使其断开连接并将其从数据库管理器的缓存中删除:

...

Config::set('database.connections.mysql_test.database', $db);

DB::purge('mysql_test');

dump(DB::connection('mysql_test')->getDatabaseName());

【讨论】:

  • 先生,您救了我的命。谢谢。
【解决方案2】:

配置值更改后需要重新连接数据库

DB::reconnect("mysql_test");

【讨论】:

  • 不,同样的结果。不明白。
  • DB::connection('mysql_test')-&gt;getDoctrineConnection()-&gt;close(); 这也不行
  • 这是什么结果? error_log(DB::connection('mysql_test')->getDatabaseName());
  • 输出空白
【解决方案3】:

DB::Purge() 为我修复了它。 Laravel 8.x 升级后似乎需要这样做。在 Laravel 任务确实在需要时切换数据库连接之前。经过一些更新,他们不再这样做了。

【讨论】:

    【解决方案4】:

    我在 Laravel 5.7 上遇到了同样的问题

    在我的情况下,DB::purge('mysql_test')DB::reconnect("mysql_test") 也不起作用,所以我这样做了:

    $db_connection_name = 'mysql_test'; // Connection name that i wanted to connect
    Config::set('database.default', $db_connection_name);
    

    【讨论】:

      【解决方案5】:

      这应该更有效,因为它不必重新连接到数据库。

      DB::table("products")->get(); //tenant A
      DB::statement("use tenant_b");
      DB::table("products")->get(); //tenant B
      

      【讨论】:

      • 如果这是一个答案,您应该考虑使用edit 以更清楚地表明这是一个答案而不是一个问题。如果审阅者认为这是一个单独的问题,它可能会在审阅中被删除。
      猜你喜欢
      • 2011-12-07
      • 1970-01-01
      • 1970-01-01
      • 2018-08-29
      • 2016-06-12
      • 2013-01-05
      • 1970-01-01
      • 2021-07-30
      • 2020-02-13
      相关资源
      最近更新 更多