2013-09-24 51 views
6

在我的database.php中,我配置了兩個數據庫。Laravel - 更改全局默認數據庫連接

'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被初始設置爲默認DB。現在我想通過從'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! 
    } 

和上面的正常工作併成功切換數據庫。交換機是「每個請求」的基礎嗎?

回答

2

您是否試過簡單地更改app/config/database.php中的默認連接?

'default' => 'db2' 

如果不是這種情況,請提供有關該問題的更多信息。

編輯: 所以看起來你有所有的連接在模型中硬編碼。嘗試更新機型那樣:

protected $connection = 'db2'; 
+0

沒錯。試過。我也編輯了我的問題。 – ericbae

+0

@ericbae我已經更新了我的回答 –

4

Config::set只會在每個請求的基礎工作,所以你可能會想設置你的數據庫中的會話,並抓住它在後續請求。

你在哪裏可以做到這一點的選擇。 /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); 
} 
+0

我假設數據庫是爲每個用戶設置的。如果不是,會議不是要走的路。 –