lexbelcode/laravel-eloquent-dynamic-tables-for-models

在运行时设置模型表格的简单而有效的方法,继续使用 Eloquent 而不是 QueryBuilder

v0.1.0 2023-11-28 20:31 UTC

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