andreisizyi / eloquent-eager-limit
Laravel Eloquent eager loading with limit
dev-master
2021-10-15 17:38 UTC
Requires
- php: ^7.3|^8.0
- illuminate/database: ^8.0
Requires (Dev)
- phpunit/phpunit: ^9.3
This package is not auto-updated.
Last update: 2025-07-06 11:03:52 UTC
README
Introduction
This Laravel Eloquent extension allows limiting the number of eager loading results per parent using window functions.
Supports Laravel 5.5.29+.
Compatibility
- MySQL 5.7+
- MySQL 5.5~5.6: Due to a bug in MySQL, the package only works with strict mode disabled.
In yourconfig/database.php
file, set'strict' => false,
for the MySQL connection. - MariaDB 10.2+: Due to a bug in MariaDB, the package only works with strict mode disabled.
In yourconfig/database.php
file, set'strict' => false,
for the MariaDB connection. - PostgreSQL 9.3+
- SQLite 3.25+: The limit is ignored on older versions of SQLite. This way, your application tests still work.
- SQL Server 2008+
Installation
composer require staudenmeir/eloquent-eager-limit:"^1.0"
Usage
Use the HasEagerLimit
trait in both the parent and the related model and apply limit()/take()
to your relationship:
class User extends Model { use \Staudenmeir\EloquentEagerLimit\HasEagerLimit; public function posts() { return $this->hasMany('App\Post'); } } class Post extends Model { use \Staudenmeir\EloquentEagerLimit\HasEagerLimit; } $users = User::with(['posts' => function ($query) { $query->latest()->limit(10); }])->get();
Improve the performance of HasOne
/HasOneThrough
/MorphOne
relationships by applying limit(1)
:
class User extends Model { use \Staudenmeir\EloquentEagerLimit\HasEagerLimit; public function latestPost() { return $this->hasOne('App\Post')->latest()->limit(1); } } class Post extends Model { use \Staudenmeir\EloquentEagerLimit\HasEagerLimit; } $users = User::with('latestPost')->get();
You can also apply offset()/skip()
to your relationship:
class User extends Model { use \Staudenmeir\EloquentEagerLimit\HasEagerLimit; public function posts() { return $this->hasMany('App\Post'); } } class Post extends Model { use \Staudenmeir\EloquentEagerLimit\HasEagerLimit; } $users = User::with(['posts' => function ($query) { $query->latest()->offset(5)->limit(10); }])->get();
Contributing
Please see CONTRIBUTING and CODE OF CONDUCT for details.