2016-11-24 25 views
0

在我的項目,我必須選擇,在登錄時,我想在應用程序中使用,直到下一次註銷該數據庫的多個數據庫連接。Laravel - 如何使用動態

我正在想辦法將數據庫名稱保存到全局變量中,但我不知道如何。

在這一刻我試圖在數據庫上設置路線:

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和頁面的登錄返回到應用程序/組,這是工作,將數據庫更改爲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 ListCustomer() 
    { 
     $customer = new Customer(); 
     $customer->setConnection(session('database_name', 'default_database_connection')); 
     $customers = $customer->get(); 
     return $customers; 
    } 
} 

但是你必須特別小心地使用這種方法。因爲它在使用關係時有一些警告。

+0

這是可以做到這一點在路線,而不是控制器? 例如:在登錄後我創建會話並使用它。 @ Steve.NavyLinAung – user3242861

+0

@ user3242861在我的示例中,我在路由中創建了會話。但在控制器中使用此會話值。如果您想在路線中使用會話值,我認爲如果您正確實施,這很有可能。但爲了更好地幫助您,您需要提供更多的代碼。 –

+0

使用config :: set on構造不起作用。我在登錄帖子的會話中保存了數據庫名稱,並在查詢中使用此會話來告訴女巫數據庫是否使用並且工作正常。感謝幫助我@ Steve.NavyLinAung – user3242861