9

私のdatabase.phpでは、2 つのデータベースが構成されています。

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

上記は正常に機能し、データベースの切り替えに成功しました。スイッチは「リクエストごと」に基づいていますか?

4

3 に答える 3

7

Config::setリクエストごとにのみ機能するため、おそらくセッションでデータベースを設定し、後続のリクエストでそれを取得したいと思うでしょう。

どこでそれを行うかについて、いくつかのオプションがあります。 /app/start/global1つのオプションになります。コントローラーでは、コンストラクターは別のものになります。サービスプロバイダーを登録してそれを行うこともできます.

以下は、コードが [警告: テストされていないコード!] コントローラー コンストラクターでどのように見えるかの例です。

   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);
}
于 2013-09-25T15:59:42.883 に答える