【发布时间】:2015-01-13 00:39:16
【问题描述】:
伙计们,
我已经尝试克服这个问题 10 多个小时了,我决定在发疯之前寻求帮助。
我想要实现的是某种多租户,其中我为每个客户都有一个专用数据库,并且根据请求的发布者,应该加载具体的数据库。例如。如果客户 A 发送请求,则加载数据库 A,如果 B 发送请求,则加载数据库 B。我们有成千上万的客户,因此无法在 databse.php 文件中预定义所有配置。
在一些特殊情况下,无论发行者如何,都应该加载相同的数据库。例如。如果请求是 X,则始终加载数据库 C。
我有以下架构: BaseModel 扩展了 Eloquent 模型。 扩展 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);
}
我面临的问题是我似乎只能设置一次配置。换句话说,如果我在请求的整个生命周期中只需要数据库 A 或 B,那么一切正常。但是,如果我需要切换到数据库 C,这是行不通的。 BaseModel 继续在 A 或 B 中查找所需的表,即使我尝试显式加载 C。它看起来好像 db 设置是不可变的或类似的东西。
也就是说,我有几个问题:
什么是动态加载不同数据库运行时的最佳方式,记住一个请求可能需要查询多个数据库,而不仅仅是一个。
如何卸载或重置数据库连接,以便设置新连接?
Laravel 中的哪种方法可以为我提供有关当前数据库连接的信息?我需要调试的方法,但我完全看不到可能的方法。
任何帮助/提示将不胜感激。
【问题讨论】:
标签: laravel laravel-4 eloquent