我正在重构旧数据库,我想快速查询/修改其他数据库中的表。
例如,我有20个以公司部门编号命名的数据库:
DbNameWeird-100
DbNameWeird-125
DbNameWeird-245
DbNameWeird-336
...
每个数据库具有相同的结构。我想做的是一个完整的重构,而不是要做20个不同的连接:
Foo::where('department', 125)->all();
中期目标是通过在每个表上添加名为department
的新主键列来将这些数据库合并在一起。但是目前我只想做:
$foo = Foo($department);
$foo->all();
要朝这个方向发展,我需要建立联系:
foreach($departments as $dep) {
DB::addConnection(dbConnection("DbNameWeird-{$dep}"), "db-{$dep}");
}
然后,我需要动态更新我的protected $connection
模型的Foo
。
我要用一块石头杀死两只鸟,是这样写的:
class Foo extends \Eloquent
{
protected $table = 'foo';
protected $connection;
public $timestamps = false;
protected $guarded = [];
public function __construct($department) {
DB::addConnection(dbConnection("DbNameWeird-{$department}"), "db-{$department}");
$this->connection = "db-{$department}";
parent::__construct();
}
}
dd((new Foo(42))->all());
不幸的是,它不起作用。我收到此错误:
Too few arguments to function Foo::__construct(), 0 passed in
project/portal/vendor/illuminate/database/Eloquent/Model.php
on line 460 and exactly 1 expected
此代码有什么问题?
答案 0 :(得分:1)
Using Multiple Database Connections
使用多个
connections
时,可以通过DB
外观上的连接方法访问每个连接。传递给name
方法的connection
应该对应于config/database.php
配置文件中列出的连接之一:$users = DB::connection('foo')->select(...);
您还可以在连接实例上使用getPdo方法访问原始的基础PDO实例:
$pdo = DB::connection()->getPdo();
如果您需要更改Eloquent models
上的连接并且 DB
还不够:
您还可以在运行时通过setConnection方法定义连接
$foo = (new Foo)->setConnection('DbNameWeird-100');
$foo->first(); // or $foo->all();
或者您可以像这样使用on method:
Foo::on('DbNameWeird-100')->first();
Foo::on('DbNameWeird-125')->first();