在我的项目中,我必须在登录时选择我想在应用程序中使用哪个数据库,直到下次注销。
我正在考虑将数据库名称保存为全局变量,但我不知道如何。
在这一刻,我试图在路线上设置数据库:
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登录并且页面被返回到app / groups并且它正常工作,将数据库更改为db2并显示数据但是当我选择另一个链接时,它似乎失去了连接因为给了我一个sql错误。
这样做的最佳选择是什么?数据库的选择必须是动态的。
如果我将数据库名称保存到全局变量中,我可以使用该名称进行查询:
DB::connection($name)->select(...);
我该如何解决?
由于
答案 0 :(得分: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;
}
}
但你必须特别小心使用这种方法。因为在使用关系时有一些警告。
答案 1 :(得分:0)