【问题标题】:Laravel limit eager loading for each modelLaravel 限制每个模型的急切加载
【发布时间】:2019-05-19 03:23:59
【问题描述】:

使用我们的用户模型,我们渴望加载对话和这些对话的消息。在每个对话中,我们希望引导最后 25 条消息。所以我们编写了以下查询。

User::where('status', 3)->with(['conversations.messages' => function ($q) {
    $q->take(25)->orderBy('created_at', 'DESC');
}])->get();

但是,此函数总共只返回 25 条消息(因此不是每个对话)。即使您有 1000 个用户,它也会加载消息表中的最后 25 条消息,但不会加载用户每次对话的最后 25 条消息。

有没有办法在 Laravel Eloquent 方法中解决这个问题?

【问题讨论】:

标签: laravel eloquent


【解决方案1】:

Laravel 对此没有原生支持。

我为它创建了一个包:https://github.com/staudenmeir/eloquent-eager-limit

在父模型和相关模型中使用 HasEagerLimit 特征。

class Conversation extends Model {
    use \Staudenmeir\EloquentEagerLimit\HasEagerLimit;
}

class Message extends Model {
    use \Staudenmeir\EloquentEagerLimit\HasEagerLimit;
}

然后简单地将->take(25) 调用链接到您的急切加载查询(您似乎已经这样做了)。

您甚至可以使用->offset(...)->skip(...)(有关详细信息,请参阅存储库自述文件)。

【讨论】:

    猜你喜欢
    • 2016-02-09
    • 1970-01-01
    • 2015-06-19
    • 2019-12-20
    • 2013-06-10
    • 2013-05-16
    • 2017-05-30
    • 2020-09-08
    相关资源
    最近更新 更多