Laravel Eloquent eager loading with limit
staudenmeir/eloquent-eager-limit is a Laravel package for laravel eloquent eager loading with limit.
It currently has 883 GitHub stars and 3.770.788 downloads on Packagist (latest version v1.8.3).
Install it with composer require staudenmeir/eloquent-eager-limit.
Discover more Laravel packages by staudenmeir
or browse all Laravel packages to compare alternatives.
Last updated
[!IMPORTANT] The package's code has been merged into Laravel 11+ and eager loading limits are now supported natively.
This Laravel Eloquent extension allows limiting the number of eager loading results per parent using window functions.
Supports Laravel 5.5–10.
config/database.php file, set 'strict' => false, for the MySQL connection.composer require staudenmeir/eloquent-eager-limit:"^1.0"
Use this command if you are in PowerShell on Windows (e.g. in VS Code):
composer require staudenmeir/eloquent-eager-limit:"^^^^1.0"
| Laravel | Package | |:--------|:--------| | 10.x | 1.8 | | 9.x | 1.7 | | 8.x | 1.6 | | 7.x | 1.5 | | 6.x | 1.4 | | 5.8 | 1.3 | | 5.5–5.7 | 1.2 |
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();
staudenmeir/laravel-adjacency-list: Replace both packages
with staudenmeir/eloquent-eager-limit-x-laravel-adjacency-list
to use them on the same model.staudenmeir/laravel-cte: Replace both packages
with staudenmeir/eloquent-eager-limit-x-laravel-cte
to use them on the same model.topclaudy/compoships: Replace both packages
with mpyw/compoships-eager-limit
to use them on the same model.Please see CONTRIBUTING and CODE OF CONDUCT for details.