gurucomkz / eagerloading
Eager loading for SilverStripe 4
Installs: 87
Dependents: 0
Suggesters: 0
Security: 0
Stars: 5
Watchers: 1
Forks: 4
Open Issues: 0
Type:silverstripe-vendormodule
pkg:composer/gurucomkz/eagerloading
Requires
- silverstripe/framework: ^4.9
Requires (Dev)
- phpunit/phpunit: ^9.5
- silverstripe/admin: ^1.6
- tractorcow/silverstripe-proxy-db: ^1.0
README
Attempt to solve N+1 problem in SilverStripe 4.
Deprecated
SilverStripe 5 has this feature built-in. Please use SilverStripe 5.
Usage
MyModelClass::get()->with(['Relation1','Relation2'])->filter(...);
It does not require huge configuration - only one function to be added to the query builder chain : ->with([..relations...]).
This will result in the final DataList to be presented by the EagerLoadedDataList class that handles the eager loading.
The module takes advantage of DataList::getGenerator() to query for and attach the related records only when needed.
Installation
composer require gurucomkz/eagerloading
Every DataObject that has has_one/many_many/belongs_many_many which you wish to have eagerloaded must include EagerLoaderMultiAccessor (see below).
Features
- Using with $has_one / $belongs_to
- Using with $has_many / $many_many / $belongs_many_many
- Boosting GridField output
- Boosting CSV export
Read the docs for full explanation.
Quick start
1. Add the following trait to all your models to use $has_many, $many_many, $belongs_meny_many:
class MyClass extends DataObject { use Gurucomkz\EagerLoading\EagerLoaderMultiAccessor; // ... }
If you have your own __call() read Using with $has_many/$many_many.
2. Declare private static $eager_loading to boost ModelAdmin's GridField output.
class YourClass extends DataObject { private static $eager_loading = [ 'Relation1', 'Relation1.Relation4', 'Relation2', 'Relation3', ]; }
TODO
- for
->with(['RelLevel1.RelLevel2'])- do not query forRelLevel1IDs twice. - for
->with(['RelLevel1','RelLevel1.RelLevel2'])- do not query forRelLevel1IDs thrice.
Reporting Issues
Please create an issue for any bugs you've found, or features you're missing.