lexbelcode / laravel-eloquent-dynamic-tables-for-models
在运行时设置模型表格的简单而有效的方法,继续使用 Eloquent 而不是 QueryBuilder
Requires
- php: ^8.1
- laravel/framework: ^10.0
This package is auto-updated.
Last update: 2024-09-28 23:51:36 UTC
README
###在运行时设置模型表格的简单而有效的方法,继续使用 Eloquent 而不是 QueryBuilder
安装
可以通过 Composer 安装此包
composer require lexbelcode/laravel-eloquent-dynamic-tables-for-models
描述
考虑以下场景
您有一个数据库,其中存在 A) 名称不同但结构相同的表,或者您需要将一个非常大的表分解成更小的表,但不希望使用数据库提供的分区,以及 B) 名称不同但结构相同,并且与 A) 中的表相关联的表
示例:通常,如果您有一个用于销售的模型和一个用于买家的模型,并且您需要从销售表中获取与买家相关联的记录,使用 Eloquent 您将这样做
$data = Sell::select(...here your columns...) ->where(...here your filters...) ->with('buyers') ->get();
但如果有这样的场景变化,您必须将您的表分成多个,如下所示:sells_01 sells_02 sells_03 sells_04
buyers_01 buyers_02 buyers_03 buyers_04
您的模型是相同的,但如果您需要从 sells_03 获取相关联的 buyers_03 数据 您不能像以前那样使用 Eloquent,因为您的 Sell 模型指向 sells 表,而您的 Buyer 模型指向 buyers 表,因此,获取数据的唯一方法是使用 QueryBuilder 或原始查询使用连接,您将失去 Eloquent 的魔法,包括,如果您有 Eloquent 事件,您将无法触发它们,因为这个问题
但如果你更新你的模型,以扩展 LaravelEloquentDynamicModel 类,你可以这样做
您的模型
use lexbelcode\LaravelEloquentDynamicTablesForModels\LaravelEloquentDynamicModel; class Sell extends LaravelEloquentDynamicModel { ... }
use lexbelcode\LaravelEloquentDynamicTablesForModels\LaravelEloquentDynamicModel; class Buyer extends LaravelEloquentDynamicModel { ... }
并在您的代码中,您只需添加这两行代码
Sell::$dynamicTableName = 'sells_03'; Buyer::$dynamicTableName = 'buyers_03'; $data = Sell::select(...here your columns...) ->where(...here your filters...) ->with('buyers') ->get();
在相关 PHP 脚本的执行时间内,模型 Sell 将指向 sells_03 表,模型 Buyer 将指向 buyers_03 表,您可以使用 Eloquent 正常使用这些模型,包括关系、事件等。
要求
作者
Alex Beltrán 在 X 上关注我 @LexBelCode