2013-09-24 5 views
6

In meinem database.php, habe ich zwei Datenbanken konfiguriert.Laravel - Ändern der Standard-Datenbankverbindung global

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

standardmäßig So db1 wird als Standard DB zunächst eingestellt. Jetzt möchte ich die Standarddatenbank auf "db2" umstellen, indem ich eine Option aus dem Dropdown-Menü "Auswählen" auswähle. Dies wird einen Beitrag AJAX-Anforderung an den Controller-Methode tun, in dem ich

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

tun Sobald dies erledigt ist, ich refresh "die Seite, aber die Verbindung ist immer noch auf‚DB1‘.

Ich habe auch versucht die folgende

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

Und die oben funktioniert gut und es schaltet die Datenbank erfolgreich. Ist der Wechsel 'pro Anfrage' möglich?

Antwort

2

Haben Sie versucht, einfach die Standardverbindung in app/config/database.php zu ändern?

'default' => 'db2' 

Wenn dies nicht der Fall ist, geben Sie bitte weitere Informationen zu dem Problem an.

Bearbeiten: So scheint es, Sie haben alle Verbindungen in den Modellen fest codiert. Versuchen Sie, die Modelle wie die Aktualisierung:

protected $connection = 'db2'; 
+0

yep . versucht. hat meine Frage auch bearbeitet. – ericbae

+0

@ericbae Ich habe meine Antwort aktualisiert –

4

Config::set wird nur auf einer Pro-Anfrage Basis zu arbeiten, so dass Sie wahrscheinlich gehen zu wollen, Ihre Datenbank in der Sitzung setzen und es auf nachfolgende Anfragen greifen.

Sie haben einige Optionen, wo Sie das tun können. /app/start/global wäre eine Option. Im Controller-Konstruktor wäre ein anderer. Sie können einen Dienstanbieter auch dafür registrieren.

Unten ist ein Beispiel dafür, was der Code aussehen könnte [Warnung: ungetesteten Code!] Im Controller-Konstruktor:

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

und ein Update auf Ihre Funktion Datenbank Einstellung:

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

Ich gehe davon aus, dass die Datenbank für jeden Benutzer festgelegt ist. Wenn nicht, sind Sitzungen nicht der richtige Weg. –

Verwandte Themen