2013-09-24 12 views
6

Nel mio database.php, ho due database configurati.laravel - modificare la connessione al database di default a livello globale

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

Quindi per default db1 è impostato come predefinito DB inizialmente. Ora voglio cambiare il database di default a 'db2' selezionando un'opzione dal 'selezionare' discesa. Questo farà una richiesta POST AJAX per il metodo di controllo in cui faccio

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

Una volta fatto questo, ho 'Aggiorna' nella pagina, ma la connessione è ancora a 'db1'.

Ho anche provato il seguente

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

E quanto sopra funziona bene e passa correttamente il database. Il commutatore è "per richiesta"?

risposta

2

Hai provato semplicemente per cambiare la connessione predefinita in app/config/database.php?

'default' => 'db2' 

Se non è il caso, allora si prega di fornire maggiori informazioni sul problema.

Edit: così sembra di avere tutti i collegamenti hardcoded nei modelli. Prova ad aggiornare i modelli del genere:

protected $connection = 'db2'; 
+0

sì . provato. ha modificato anche la mia domanda. – ericbae

+0

@ericbae Ho aggiornato la mia risposta –

4

Config::set è solo andare a lavorare su una base per-richiesta, quindi probabilmente stai andando a voler impostare il database in sessione e afferrarlo durante le richieste successive.

avete alcune opzioni su dove farlo. /app/start/global sarebbe una opzione. Nel costruttore del controller sarebbe un altro. Potresti anche registrare un fornitore di servizi per farlo.

Di seguito è un esempio di ciò che il codice potrebbe essere simile [Warning: codice non testato!] Nel costruttore di controllo:

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

e un aggiornamento alla funzione di impostazione del database:

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

sto supponendo che il database sia impostato per ogni utente. In caso contrario, le sessioni non sono la strada da percorrere. –

Problemi correlati