2016-11-24 105 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