在我的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
最初设置为默认数据库。现在我想通过从'select'下拉列表中选择一个选项将默认数据库切换为'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!
}
以上工作正常,它成功切换数据库。交换机是否按“请求”进行?
答案 0 :(得分: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');
}
}
并更新数据库设置功能:
public function postChangeDb() {
$db = Input::get('db');
Session::put('selected_database',$db);
Config::set('database.default', $db);
}
答案 1 :(得分:2)
您是否曾尝试更改app/config/database.php
中的默认连接?
'default' => 'db2'
如果情况并非如此,请提供有关此问题的更多信息。
修改强> 因此,似乎您在模型中对所有连接进行了硬编码。尝试更新类似的模型:
protected $connection = 'db2';
答案 2 :(得分:0)
就像J.T. Grimes 说,Config::set()
只为一个请求设置。
我通过创建一个中间件来检查某个条件是否为真,然后调用 set()
方法解决了这个问题。这个中间件在每个请求中都会被调用,使其成为某种“全局”。
// check if the app is running in test mode
if (config('app.env') == 'test') {
Config::set('database.default', 'mysql_test');
}