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
这段代码有什么问题?
解决方案
使用推荐的解决方案:
当使用多个时,您可以通过门面
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 方法:
Foo::on('DbNameWeird-100')->first();
Foo::on('DbNameWeird-125')->first();
推荐阅读
- sql - SQL中日期的滞后函数
- assembly - 添加两个整数并将总和整数打印到标准输出
- python - 加载所有权重的 Roberta 模型
- dart - 如何在 dart 语言中解决此错误:NoSuchMethodError : method not found: 'readLineSync'
- css - 在不使用图像的情况下将 CSS 剪辑路径转换为 SVG 剪辑路径
- vuex - 为什么 vuex 在 Quasar App 中返回对象而不是数组?
- slickgrid - Slickgrid 多个复选框列
- sql - SELECT 语句包含拼写错误或缺失的保留字或参数名称 - SQL 问题 Select 子句
- python - 拆分文件夹 Python 用于文件数量不平衡的问题,以保持固定数量的文件用于训练集
- python - python re模块中split函数的空匹配