2013-09-24 83 views
6

Trong database.php, tôi có HAI cấu hình cơ sở dữ liệu.Laravel - thay đổi kết nối cơ sở dữ liệu mặc định trên toàn cầu

'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', 
), 

Vì vậy, theo mặc định db1 được đặt làm mặc định DB ban đầu. Bây giờ tôi muốn chuyển cơ sở dữ liệu mặc định thành 'db2' bằng cách chọn một tùy chọn từ trình đơn thả xuống 'chọn'. Thao tác này sẽ gửi yêu cầu AJAX gửi đến phương thức điều khiển mà tôi thực hiện

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

Sau khi hoàn tất, tôi 'làm mới' trang nhưng kết nối vẫn ở 'db1'.

Tôi cũng thử như sau

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! 
    } 

Và trên hoạt động tốt và nó chuyển thành công cơ sở dữ liệu. Cơ sở chuyển đổi 'theo yêu cầu' có phải là cơ sở không?

Trả lời

2

Bạn đã thử thay đổi kết nối mặc định trong app/config/database.php chưa?

'default' => 'db2' 

Nếu không phải vậy, vui lòng cung cấp thêm thông tin về sự cố.

Chỉnh sửa: Vì vậy, có vẻ như bạn có tất cả các kết nối được mã hóa cứng trong các mô hình. Thử cập nhật các mô hình như thế:

protected $connection = 'db2'; 
+0

vâng . đã thử. cũng đã chỉnh sửa câu hỏi của tôi. – ericbae

+0

@ericbae Tôi đã cập nhật câu trả lời của mình –

4

Config::set chỉ là đi làm việc trên một cơ sở cho mỗi yêu cầu, vì vậy có thể bạn sẽ muốn thiết lập cơ sở dữ liệu của bạn trong phiên và lấy nó trên yêu cầu tiếp theo.

Bạn có một số tùy chọn về nơi cần thực hiện điều đó. /app/start/global sẽ là một tùy chọn. Trong constructor điều khiển sẽ khác. Bạn cũng có thể đăng ký một nhà cung cấp dịch vụ để làm điều đó.

Dưới đây là một ví dụ về những gì các mã có thể trông giống như [cảnh báo: Mã chưa được kiểm tra!] Trong các nhà xây dựng bộ điều khiển:

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

và một bản cập nhật để chức năng thiết lập cơ sở dữ liệu của bạn:

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

Tôi giả định rằng cơ sở dữ liệu được đặt cho từng người dùng. Nếu không, các phiên không phải là cách để đi. –