强制Eloquent模型重新解析数据库连接

时间:2015-03-05 04:35:37

标签: laravel eloquent

有没有办法强制Eloquent模型重新解析他们实例化的连接?

现在我有一个方法可以在循环中更改数据库连接:

foreach ($array as $key => $value) {

   Config::set('database.connections.mysql.database', $key . '_' . $database);

   $productRepo = new ProductRepository();    

   $products = $productRepo->all();

}

在产品库中,我调用Eloquent方法all()来获取数据库中的所有产品。

我发现连接已更改为数组中的第一个值,但在进一步执行循环时不会更改。

我可以做些什么来强制Eloquent在运行时解析连接参数?

2 个答案:

答案 0 :(得分:1)

每个数据库实际上都是一个单独的连接,因此我将在config/database.php文件中设置与数据库的所有连接,然后您可以使用模型上的setConnection()方法在它们之间切换。

database.php中:

return [
    'default' => 'mysql-key1',
    'connections' => [
        'mysql-key1' => [
            'driver'    => 'mysql',
            'database'  => 'key1_dbname,
            // etc
        ],
        'mysql-key2' => [
            'driver'    => 'mysql',
            'database'  => 'key2_dbname',
            // etc
        ]
    ]
];

ProductRepository.php:

public function setConnection($name) {
    // assumes $this->product is your Product model
    $this->product->setConnection($name);
}

代码:

$productRepo = new ProductRepository();
foreach ($array as $key => $value) {
   $productRepo->setConnection($key . '_' . $database);
   $products = $productRepo->all();
}

修改

基于评论的其他信息

Laravel仅在第一次需要时实例化与数据库的连接。创建连接后,它将重用它。如果必须为每个查询重新连接数据库,那将是一个巨大的性能问题。

话虽如此,如果您真的想按照最初设计的方式执行此操作,那么您需要做的就是在更新配置后调用DB::reconnect()方法。

foreach ($array as $key => $value) {
    Config::set('database.connections.mysql.database', $key . '_' . $database);
    DB::reconnect();

    $productRepo = new ProductRepository();
    $products = $productRepo->all();
}

但是,我强烈建议您考虑最初描述的选项,这样您就不会进行大量不必要的连接。

答案 1 :(得分:0)

在我的情况下,我没有为每个数据库配置数据库,因为它们是动态创建的。我使用了以下方法,只是更改表名以包含数据库名称(这适用于MySQL):

foreach ($array as $key => $value) {
   $productRepo = new ProductRepository();  
   $productRepo->setTable($key . '_' . $database);  
   $products = $productRepo->all();
}