Need help with eloquent-eager-limit?
Click the “chat” button below for chat support from the developer who created it, or find similar developers for support.

About the developer

staudenmeir
346 Stars 26 Forks MIT License 54 Commits 2 Opened issues

Description

Laravel Eloquent eager loading with limit

Services available

!
?

Need anything else?

Contributors list

# 23,491
PHP
Laravel
vuex
vuejs
46 commits
# 87,486
PHP
Laravel
Socket....
web-soc...
2 commits
# 145,642
Laravel
PHP
CSS
eloquen...
1 commit
# 108,007
PHP
CSS
Laravel
tree-st...
1 commit
# 679,927
PHP
1 commit

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.