是否有任何方法强制雄辩的模型重新解析它们被实例化的连接?
现在,我有一个在循环中更改数据库连接的方法:
foreach ($array as $key => $value) {
Config::set('database.connections.mysql.database', $key . '_' . $database);
$productRepo = new ProductRepository();
$products = $productRepo->all();
}在产品存储库中,我调用雄辩的方法all()来获取数据库中的所有产品。
我发现,连接被更改为数组中的第一个值,但是在循环的进一步执行时它不会改变。
我能做些什么来迫使雄辩者在运行时解析连接参数吗?
发布于 2015-03-05 06:46:53
每个数据库实际上是一个单独的连接,因此我将在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();
}但是,我强烈建议您考虑最初描述的选项,这样您就不会产生大量不必要的连接。
发布于 2016-07-06 15:14:35
在我的例子中,我没有针对每个数据库的数据库配置,因为它们是动态创建的。我使用了以下方法,只需更改表名以包括数据库名称(这适用于MySQL):
foreach ($array as $key => $value) {
$productRepo = new ProductRepository();
$productRepo->setTable($key . '_' . $database);
$products = $productRepo->all();
}https://stackoverflow.com/questions/28870084
复制相似问题