2013-09-24 13 views
6

W moim database.php mam skonfigurowane DWIE bazy danych.Laravel - zmiana domyślnego połączenia z bazą danych na całym świecie

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

Więc domyślnie db1 jest ustawiony jako domyślny DB początkowo. Teraz chcę przełączyć domyślną bazę danych na "db2", wybierając opcję z rozwijanego menu "wybierz". Będzie to zrobić żądania POST AJAX do metody kontrolera, w którym robię

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

Gdy to nastąpi, ja „” odświeżyć stronę, ale połączenie jest nadal w „db1”.

Próbowałem również następujące

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

A powyżej działa dobrze i to z powodzeniem włącza bazę danych. Czy podstawą jest przełącznik "na żądanie"?

Odpowiedz

2

Czy próbowałeś po prostu zmienić domyślne połączenie w app/config/database.php?

'default' => 'db2' 

Jeśli tak nie jest, proszę podać więcej informacji na temat problemu.

Edytuj: Wygląda na to, że wszystkie połączenia zostały zakodowane na stałe w modelach. Spróbuj zaktualizować modele tak:

protected $connection = 'db2'; 
+0

Tak . wypróbowany. zredagowałem też moje pytanie. – ericbae

+0

@ericbae Zaktualizowałem moją odpowiedź –

4

Config::set tylko będzie działać na podstawie na żądanie, więc pewnie będzie chciał ustawić bazę danych w sesji i złapał go na kolejne żądania.

Masz kilka opcji, gdzie to zrobić. /app/start/global byłaby jedną z opcji. W konstruktorze sterownika byłby inny. Możesz również zarejestrować dostawcę usług, aby to zrobić.

Poniżej jest przykład tego, co kod może wyglądać [Warning: Kod niesprawdzone!] W konstruktorze kontrolera:

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

i aktualizacja do funkcji ustawiania bazy danych:

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

Zakładam, że baza danych jest ustawiona dla każdego użytkownika. Jeśli nie, sesje nie są drogą do zrobienia. –

Powiązane problemy