Laravel - 全局更改默认数据库连接

eri*_*bae 8 php laravel

在我database.php,我配置了两个数据库.

'db1' => array(
  'driver'   => 'pgsql',
  'host'     => 'localhost',
  'database' => 'db1',
  'username' => 'root',
  'password' => 'password',
  'charset'  => 'utf8',
  'prefix'   => '',
  'schema'   => 'public',
), 

'db2' => array(
  'driver'   => 'pgsql',
  'host'     => 'localhost',
  'database' => 'db2',
  'username' => 'root',
  'password' => 'password',
  'charset'  => 'utf8',
  'prefix'   => '',
  'schema'   => 'public',
),
Run Code Online (Sandbox Code Playgroud)

因此,默认情况db1下,最初将其设置为默认DB.现在我想通过从'select'下拉列表中选择一个选项将默认数据库切换为'db2'.这将对我所做的控制器方法进行后AJAX请求

public function postChangeDb()  {
    $db = Input::get('db');
    Config::set('database.default', $db);
}
Run Code Online (Sandbox Code Playgroud)

完成后,我'刷新'页面,但连接仍然是'db1'.

我也试过以下

  public function getTest() {
    Config::set('database.default', 'db1');
    $users = User::all();
    echo sizeof($users); // returns 20

    Config::set(database.default', 'db2');
    $users = User::all();
    echo sizeof($users); // returns 50 - which is correct!
  }
Run Code Online (Sandbox Code Playgroud)

以上工作正常,它成功切换数据库.交换机是否按"请求"进行?

J.T*_*mes 5

Config::set 只会在每个请求的基础上工作,因此您可能希望在Session中设置数据库并在后续请求中获取它.

您可以选择在何处执行此操作. /app/start/global将是一种选择.在控制器构造函数中将是另一个.您也可以注册服务提供商.

下面是控制器构造函数中代码可能类似于[警告:未经测试的代码!]的示例:

   public function __construct() {
     if(Session::has('selected_database'){
        Config::set('database.default',Session::get('selected_database'));
     } else {
        return Redirect::to('database_choosing_page');
     }
   }
Run Code Online (Sandbox Code Playgroud)

以及数据库设置功能的更新:

public function postChangeDb()  {
    $db = Input::get('db');
    Session::put('selected_database',$db);
    Config::set('database.default', $db);
}
Run Code Online (Sandbox Code Playgroud)


Ser*_*sky 4

您是否尝试过简单地更改默认连接app/config/database.php

'default' => 'db2'
Run Code Online (Sandbox Code Playgroud)

如果情况并非如此,请提供有关该问题的更多信息。

编辑: 看来您在模型中硬编码了所有连接。尝试像这样更新模型:

    protected $connection = 'db2';
Run Code Online (Sandbox Code Playgroud)