【问题标题】:How to get 2 most recent records of each related row如何获取每个相关行的 2 条最新记录
【发布时间】:2016-01-04 23:57:20
【问题描述】:

假设我有这两张桌子:

Users: id, name

Posts: id, user_id, created_at

我正在尝试获取每个用户的 2 个最新帖子。我正确设置了关系模型。起初我以为我可以只使用 ->take(2) 但这只会从整个查询中返回 2 行。

这就是我现在拥有的:

$user->load(['posts' => function($query) {
    $query->orderBy('id', 'desc');
}]);

这将返回每个用户的所有帖子。现在确实不是问题,但如果用户有成百上千的帖子,那将很快成为内存占用。

希望使用急切加载来获取每个用户的最后 2 条记录的最佳方法是什么?我可以通过获取每个用户的最后 2 条记录轻松做到这一点,但查询太多了。

【问题讨论】:

    标签: laravel laravel-5 eloquent


    【解决方案1】:

    试试这个。

    注意:查询的运行次数为返回的用户数+1;

    // Get all users with posts
    $users = User::whereHas('posts', function($query) {
        $query->whereNotNull('user_id');
    })->get();
    
    // Add just the 2 most recent posts to the collection
    $users = $user->map(function ($user) {
        $user->timeEntries = $user->posts()
                                  ->orderBy('created_at', 'DESC')
                                  ->take(2)
                                  ->get();
    
        return $user;
    });
    

    不幸的是,在 Eloquent 中没有直接的方法来限制从关系返回的记录数。

    另一种方法是使用普通的旧 SQL 编写查询,这样您只需 1 个查询即可完成。

    请记住,Eloquent 是一种工具,因此,它可能并不总是最适合这项工作。当涉及到高级查询时尤其如此。仅仅因为你可以在 Eloquent 中做到这一点并不意味着你应该这样做。我认为我们很多开发人员认为,因为我们购买了这个框架,它有一个非常好的 ORM,我们必须使用它,否则我们做的“错误”,它不是“Laravel 方式”(或任何框架我们可能正在使用 PHP 或其他方式),但情况并非如此。 简单的胜利。

    【讨论】:

    • 嗯,我正在尝试确定最好的方法。我还有另外两个要加载给用户的关系,它们在急切加载时效果很好,所以我可能不得不放弃所有这些,只做 1 个更大的 sql 查询,并尝试一次性抓住它。
    • 想知道为什么会投反对票?如果有办法改进我想知道的答案(特别是因为 OP 接受了它)。
    猜你喜欢
    • 2020-07-23
    • 2016-11-26
    • 1970-01-01
    • 2021-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多