Laravel 4.2动态数据库连接

时间:2014-02-04 18:50:09

标签: php mysql database laravel

我正在尝试在同一个实例下建立与多个数据库的连接以进行相关数据分析

以下是连接代码的基本概念

    $a = array('a','b','c');
    $b = array('a','b','c');

    foreach($a as $ac){
        foreach($b as $bc){     
            Config::set('database.connections.'.$ac.'_'.$bc, array(
                'driver'    => 'mysql',
                'host'      => 'somehost',
                'port'      => '3306',
                'database'  => $ac.'_'.$bc,
                'username'  => 'user',
                'password'  => 'user',
                'charset'   => 'utf8',
                'collation' => 'utf8_unicode_ci',
                'prefix'    => ''
            ));
        }
    }

在该实例中大约有40个不同的db,并且可能会快速更改,因此我希望避免在配置文件中永久创建连接并使用用户输入动态生成连接。从我收集的内容来看,上面的代码应该自动将数组附加到database.connections(参见laravel github),但是我收到了这个错误。

  

SQLSTATE [HY000] [2002]没有这样的文件或目录

如果我将database.connections.".$ac.'_'.$bc更改为database.connections.mysql,则代码运行正常。所以我在这里缺少:(,我在第一个控制器的构造函数下调用那段代码,输入将会命中。

非常感谢您提前提供的帮助

1 个答案:

答案 0 :(得分:0)

玩了一下之后,发现了什么问题。 在控制器中调用上面的代码后, 在模型中,您不仅必须进行初始连接,而且还必须在该语句中包含一个表,以便将连接转移到特定数据库,否则如果使用构建器查询的方式,它将回退到默认连接Laravel文档中的示例。所以不要做

$this->query = DB::connection($ac.'_'.$bc);
$this->query = DB::table('sometable');

就像

一样
$this->query = DB:connection($ac.'_'.$bc)->table('sometable');

然后$ this->查询的连接将锁定到指向的新数据库。