小编Mit*_* Ka的帖子

如何覆盖Laravel的数据库连接

民间,

我已经尝试克服这个问题十多个小时了,我决定在发疯之前先寻求帮助。

我要实现的是某种多租户的关系,在该租户中,我有一个针对每个客户的专用数据库,并且应根据请求的发布者来加载具体的数据库。例如,如果客户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设置是不可变的或类似的东西。

也就是说,我有几个问题:

  1. 考虑到一个请求可能需要查询多个数据库而不仅仅是一个数据库,因此动态加载不同数据库运行时的最佳方法是什么。

  2. 如何卸载或重置数据库连接,以便设置一个新的数据库连接?

  3. Laravel中的哪个方法可以为我提供有关当前数据库连接的信息?我需要调试它的方法,但是我完全不知道这样做的可能方法。

任何帮助/提示将不胜感激。

laravel eloquent laravel-4

1
推荐指数
1
解决办法
1563
查看次数

标签 统计

eloquent ×1

laravel ×1

laravel-4 ×1