如何在Laravel中用Eloquent创建动态模型?

时间:2018-12-15 14:15:09

标签: php laravel eloquent

我正在重构旧数据库,我想快速查询/修改其他数据库中的表。

例如,我有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

此代码有什么问题?

1 个答案:

答案 0 :(得分:1)

使用recommended solution

  

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();