有没有办法强制Eloquent模型重新解析他们实例化的连接?
现在我有一个方法可以在循环中更改数据库连接:
foreach ($array as $key => $value) {
Config::set('database.connections.mysql.database', $key . '_' . $database);
$productRepo = new ProductRepository();
$products = $productRepo->all();
}
在产品库中,我调用Eloquent方法all()来获取数据库中的所有产品。
我发现连接已更改为数组中的第一个值,但在进一步执行循环时不会更改。
我可以做些什么来强制Eloquent在运行时解析连接参数?
答案 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();
}