smartleads/eloquent-eager-limit

Laravel Eloquent 预加载限制

dev-master 2024-09-03 13:38 UTC

This package is not auto-updated.

Last update: 2024-09-18 09:46:27 UTC


README

Eloquent Eager Limit

[!重要] 该包的代码已合并到 Laravel 11+ 中,并且预加载限制现在已原生支持。

此 Laravel Eloquent 扩展允许使用 窗口函数 对每个父项的预加载结果进行限制。

支持 Laravel 5.5–10。

兼容性

  • MySQL 5.7+
  • MySQL 5.5~5.6:由于 MySQL 的一个错误,该包仅在严格模式禁用的情况下工作。
    在您的 config/database.php 文件中,将 MySQL 连接的 'strict' => false, 设置为。
  • MariaDB 10.2+
  • PostgreSQL 9.3+
  • SQLite 3.25+:在 SQLite 的较旧版本中忽略限制。这样,您的应用程序测试仍然可以工作。
  • SQL Server 2008+

安装

composer require staudenmeir/eloquent-eager-limit:"^1.0"

如果您在 Windows 的 PowerShell 中(例如,在 VS Code 中),请使用此命令

composer require staudenmeir/eloquent-eager-limit:"^^^^1.0"

版本

Laravel
10.x1.8
9.x1.7
8.x1.6
7.x1.5
6.x1.4
5.81.3
5.5–5.71.2

用法

在父模型和相关模型中同时使用 HasEagerLimit 特性,并将 limit()/take() 应用到您的关联上

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();

通过应用 limit(1) 提高对 HasOne/HasOneThrough/MorphOne 关系的性能

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();

您还可以将 offset()/skip() 应用到您的关联上

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();

包冲突

贡献

有关详细信息,请参阅 CONTRIBUTINGCODE OF CONDUCT