9

在我的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',
),

所以默认db1情况下最初设置为默认数据库。现在我想通过从“选择”下拉列表中选择一个选项来将默认数据库切换为“db2”。这将对我执行的控制器方法执行发布 AJAX 请求

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

完成后,我“刷新”页面,但连接仍位于“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!
  }

以上工作正常,并成功切换数据库。开关是“每个请求”的基础吗?

4

3 回答 3

7

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

并更新您的数据库设置功能:

public function postChangeDb()  {
    $db = Input::get('db');
    Session::put('selected_database',$db);
    Config::set('database.default', $db);
}
于 2013-09-25T15:59:42.883 回答
3

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

'default' => 'db2'

如果不是这种情况,请提供有关该问题的更多信息。

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

    protected $connection = 'db2';
于 2013-09-24T07:40:03.767 回答
0

就像 JT Grimes 所说,Config::set()只为一个请求设置。

我通过创建一个检查某些条件是否为真然后调用该set()方法的中间件解决了这个问题。这个中间件在每个请求中都会被调用,使其成为某种“全局”。

// check if the app is running in test mode
if (config('app.env') == 'test') {
    Config::set('database.default', 'mysql_test');
}
于 2021-07-03T10:06:32.837 回答