Laravel - 如何动态使用多个数据库连接

时间:2016-11-24 21:06:30

标签: laravel laravel-5.3

在我的项目中,我必须在登录时选择我想在应用程序中使用哪个数据库,直到下次注销。

我正在考虑将数据库名称保存为全局变量,但我不知道如何。

在这一刻,我试图在路线上设置数据库:

    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(...);

我该如何解决?

由于

2 个答案:

答案 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)