民间,
我已经尝试克服这个问题十多个小时了,我决定在发疯之前先寻求帮助。
我要实现的是某种多租户的关系,在该租户中,我有一个针对每个客户的专用数据库,并且应根据请求的发布者来加载具体的数据库。例如,如果客户A发送请求,则加载数据库A;如果客户B发送请求,则加载数据库B。我们有成千上万的客户,因此无法在databse.php文件中预定义所有配置。
在某些特殊情况下,应与发行者无关地加载同一数据库。例如,如果请求为X,则始终加载数据库C。
我具有以下体系结构:扩展口才模型的BaseModel。扩展BaseModel的应用程序模型。一些与应用程序模型相关的库。
由于我所有的数据库请求都通过BaseModel,所以我认为最好的解决方案是在BaseModel的构造函数中插入将切换到正确数据库的代码。例如:
class BaseModel extends \Eloquent {
public function __construct(array $attributes = array()) {
$currentConfigs = \Config::get('database.connections.customers');
$currentConfigs['database'] = 'db_A'; //this varies depending on the request
$currentConfigs['prefix'] = 'custName'; //this varies depending on the request
\Config::set('database.connections.customers', $currentConfigs);
parent::__construct($attributes);
}
Run Code Online (Sandbox Code Playgroud)
我面临的问题是我似乎只能设置一次配置。换句话说,如果我在请求的整个生命周期中只需要数据库A或B,则一切正常。但是,如果我需要切换到数据库C,则无法使用。即使我尝试显式加载C,BaseModel也会继续在A或B中查找所需的表。看起来db设置是不可变的或类似的东西。
也就是说,我有几个问题:
考虑到一个请求可能需要查询多个数据库而不仅仅是一个数据库,因此动态加载不同数据库运行时的最佳方法是什么。
如何卸载或重置数据库连接,以便设置一个新的数据库连接?
Laravel中的哪个方法可以为我提供有关当前数据库连接的信息?我需要调试它的方法,但是我完全不知道这样做的可能方法。
任何帮助/提示将不胜感激。