gurucomkz / eagerloading
SilverStripe 4 的预加载
v0.6.0
2023-03-18 08:48 UTC
Requires
- silverstripe/framework: ^4.9
Requires (Dev)
- phpunit/phpunit: ^9.5
- silverstripe/admin: ^1.6
- tractorcow/silverstripe-proxy-db: ^1.0
README
尝试解决 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
(见下文)。
功能
- 与 $has_one / $belongs_to 一起使用
- 与 $has_many / $many_many / $belongs_many_many 一起使用
- 提升 GridField 输出
- 提升 CSV 导出
阅读文档以获取完整说明。
快速开始
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。
报告问题
请为任何发现的错误或缺失的功能创建问题。