首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >强制雄辩的模型重新解析数据库连接

问强制雄辩的模型重新解析数据库连接
EN

Stack Overflow用户
提问于 2015-03-05 04:35:36
回答 2查看 2.9K关注 0票数 2

是否有任何方法强制雄辩的模型重新解析它们被实例化的连接?

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

代码语言:javascript
复制
foreach ($array as $key => $value) {

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

   $productRepo = new ProductRepository();    

   $products = $productRepo->all();

}

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

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

我能做些什么来迫使雄辩者在运行时解析连接参数吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-05 06:46:53

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

database.php:

代码语言:javascript
复制
return [
    'default' => 'mysql-key1',
    'connections' => [
        'mysql-key1' => [
            'driver'    => 'mysql',
            'database'  => 'key1_dbname,
            // etc
        ],
        'mysql-key2' => [
            'driver'    => 'mysql',
            'database'  => 'key2_dbname',
            // etc
        ]
    ]
];

ProductRepository.php:

代码语言:javascript
复制
public function setConnection($name) {
    // assumes $this->product is your Product model
    $this->product->setConnection($name);
}

代码:

代码语言:javascript
复制
$productRepo = new ProductRepository();
foreach ($array as $key => $value) {
   $productRepo->setConnection($key . '_' . $database);
   $products = $productRepo->all();
}

编辑

根据评论提供的补充资料

Laravel只会在第一次需要时实例化到数据库的连接。一旦建立了连接,它就会重用它。如果您必须为每个查询重新连接到数据库,这将是一个巨大的性能问题。

尽管如此,如果您真的想按照最初设计的方式来完成这个任务,那么只需在更新配置后调用DB::reconnect()方法即可。

代码语言:javascript
复制
foreach ($array as $key => $value) {
    Config::set('database.connections.mysql.database', $key . '_' . $database);
    DB::reconnect();

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

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

票数 1
EN

Stack Overflow用户

发布于 2016-07-06 15:14:35

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

代码语言:javascript
复制
foreach ($array as $key => $value) {
   $productRepo = new ProductRepository();  
   $productRepo->setTable($key . '_' . $database);  
   $products = $productRepo->all();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28870084

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档