eloquent-eager-limit

by staudenmeir

Laravel Eloquent eager loading with limit

259 Stars 18 Forks Last release: 2 months ago (v1.6) MIT License 50 Commits 11 Releases

Available items

No Items, yet!

The developer of this repository has not created any items for sale yet. Need a bug fixed? Help with integration? A different license? Create a request here:

CI Code Coverage Scrutinizer Code Quality Latest Stable Version Total Downloads License

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 your
    config/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 your
    config/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.

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.