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

Laravel 强制雄辩的模型重新解析数据库连接,laravel,eloquent,Laravel,Eloquent,有没有办法强迫雄辩的模型重新解析它们实例化时使用的连接 现在我有一个方法可以在循环中更改数据库连接: foreach ($array as $key => $value) { Config::set('database.connections.mysql.database', $key . '_' . $database); $productRepo = new ProductRepository(); $products = $productRepo-&g

有没有办法强迫雄辩的模型重新解析它们实例化时使用的连接

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

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

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

   $productRepo = new ProductRepository();    

   $products = $productRepo->all();

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

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


我能做些什么来强制Elount在运行时解析连接参数吗?

每个数据库实际上是一个单独的连接,因此我会在
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);
}
代码:

编辑 基于评论的补充信息

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

也就是说,如果您真的希望按照最初设计的方式来执行此操作,那么只需在更新配置后调用
DB::reconnect()
方法即可

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

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

<>但是,我强烈敦促你考虑最初描述的选项,这样你就不会产生太多不必要的连接。

< P>我的数据库中没有数据库配置,因为它们是动态创建的。我使用了以下方法,只需更改表名以包括数据库名(这适用于MySQL):


谢谢这可能行得通。然而,我仍然不理解为什么模型仍然会引用第一个连接,即使它是动态更改的。希望有人能解释@yulun我已经根据你的评论在答案中添加了一些信息。嘿@patricus,很抱歉再次问这个问题,但是你知道create()方法的工作原理是否与查询方法不同吗?因为即使在模型上使用setConnection(),create()方法仍然指向以前的数据库。@yulun问题是
setConnection()
在类的实例上工作,而
create()
方法在类本身上是一个静态方法。所有的
create()
方法都是用给定的属性实例化一个新实例,然后调用
save()
。因此,您不需要使用
create()
,只需要手动执行此操作:
$productRepo=newproductrepository($attributes)$productRepo->setConnection($key.'.$database)$productRepo->save()
您还可以覆盖ProductRepository类上的
create()
方法,以接受连接来执行此操作。以防万一其他人也会遇到同样的问题。。您可以在这里参考@patricus提供的更好解释的答案
foreach ($array as $key => $value) {
    Config::set('database.connections.mysql.database', $key . '_' . $database);
    DB::reconnect();

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