gurucomkz/eagerloading

SilverStripe 4 的预加载

安装: 79

依赖项: 0

建议者: 0

安全: 0

星标: 5

关注者: 2

分支: 4

开放问题: 2

类型:silverstripe-vendormodule

v0.6.0 2023-03-18 08:48 UTC

This package is auto-updated.

Last update: 2024-09-19 16:30:27 UTC


README

Scrutinizer Code Quality Build Status Code Coverage

尝试解决 SilverStripe 4 中的 N+1 问题。[链接](https://stackoverflow.com/questions/97197/what-is-the-n1-selects-problem-in-orm-object-relational-mapping)

使用方法

MyModelClass::get()->with(['Relation1','Relation2'])->filter(...);

它不需要复杂的配置 - 只需将一个函数添加到查询构建器链中:->with([..relations...])。这将导致最终的数据列表由处理预加载的 EagerLoadedDataList 类呈现。

该模块利用 DataList::getGenerator() 仅在需要时查询和附加相关记录。

安装

composer require gurucomkz/eagerloading

希望预加载 has_one/many_many/belongs_many_many 的每个 DataObject 都必须包含 EagerLoaderMultiAccessor(见下文)。

功能

阅读文档以获取完整说明。

快速开始

1. 将以下特质添加到所有模型中,以使用 $has_many$many_many$belongs_meny_many

class MyClass extends DataObject {
    use Gurucomkz\EagerLoading\EagerLoaderMultiAccessor;

    // ...
}

如果您有自己的 __call(),请参阅 [使用 $has_many/$many_many](https://github.com/gurucomkz/silverstripe-eagerloading/blob/HEAD/docs/en/Using_With_HasMany.md)。

2. 声明 private static $eager_loading 以提升 ModelAdmin 的 GridField 输出。

class YourClass extends DataObject
{
    private static $eager_loading = [
        'Relation1',
        'Relation1.Relation4',
        'Relation2',
        'Relation3',
    ];
}

待办事项

  • 对于 ->with(['RelLevel1.RelLevel2']) - 不要两次查询 RelLevel1 ID。
  • 对于 ->with(['RelLevel1','RelLevel1.RelLevel2']) - 不要三次查询 RelLevel1 ID。

报告问题

请为任何发现的错误或缺失的功能创建问题