2016-11-24 10 views
0

私のプロジェクトでは、ログイン時に次のログアウトまでアプリケーションで使用するデータベースを選択する必要があります。Laravel - 複数のDB接続を動的に使用する方法

私はデータベースの名前をグローバル変数に保存する方法を考えていますが、私はその方法を知らないのです。にデータベースを変更し、アプリ/グループに戻した

Route::group(['middleware' => 'auth'], function() { 
    Route::get('app/groups', function() 
    { 
    DB::disconnect(); 
    Config::set('database.default','db2'); 
    DB::reconnect(); 

    return view('app.main-folders'); 
    }); 
}); 

が、私はDB1とページでログインを行うと、それが仕事である:この瞬間で

iは、ルート上にデータベースを設定しようとしていますdb2とデータを表示するが、別のリンクを選択すると、SQLエラーが出るので接続が失われているようだ。

これはどのオプションが最適ですか?データベースの選択は動的でなければなりません。

私はグローバル変数にデータベース名を保存する場合、私は、クエリを実行するためにその名前を使用することができます。

DB::connection($name)->select(...); 

どのように私はそれを解決できますか?あなたがここに偉大な解決策を見つけることができます

おかげ

答えて

1

Config::set()は、この方法では動作しません。 1件につきましては、となります。そのため、別のリンクにアクセスしたときに「新しい」接続が失われ(元のデフォルト接続を維持し続ける)ことができます。

私が思う唯一の方法は、新しいデータベース接続名sessionに保存することです。

コントローラのコンストラクタには、接続名からsessionを取得します。

例コード:

ルートにあります。

Route::group(['middleware' => 'auth'], function() { 
    Route::get('app/groups', function() 
    { 
    session(['database_name' => 'db2']); 
    return view('app.main-folders'); 
    }); 
}); 

コントローラでは、

class ItemController extends Controller 
{ 
    public function __construct() 
    { 
     // without middleware, you cannot access 
     // session() in constructor of the controller in Laravel 5.3 
     $this->middleware(function ($request, $next) { 
      Config::set('database.default', session('database_name', 'default_database_connection')); 
      return $next($request); 
     }); 
    } 

    public function ListCustomer() 
    { 
     $customers = Customer::all(); 
     return $customers; 
    } 
} 

コントローラでEloquent Modelごとの接続を変更する場合は、そのようにすることもできます。

class ItemController extends Controller 
{ 
    public function ListCustomer() 
    { 
     $customer = new Customer(); 
     $customer->setConnection(session('database_name', 'default_database_connection')); 
     $customers = $customer->get(); 
     return $customers; 
    } 
} 

ただし、このアプローチを特別な注意を払って使用する必要があります。リレーションシップを使用するときには注意が必要です。

+0

コントローラではなくルートでこれを行うことは可能ですか? たとえば、ログイン後の私はセッションを作成し、それを使用します。 @ Steve.NavyLinAung – user3242861

+0

@ user3242861私の例では、ルートでセッションを作成します。しかし、コントローラでこのセッション値を使用してください。ルートでセッション値を使用したい場合は、正しく実装するとかなり可能です。しかし、より多くのことを助けるために、より多くのコードを提供する必要があります。 –

+0

構成での設定::設定でも動作しません。私はログインポストのセッションでデータベース名を保存して、このセッションをクエリで使用して魔法使いのデータベースに使用してうまく動作するように指示します。私を助けてくれてありがとう@ Steve.NavyLinAung – user3242861

関連する問題