Laravel 如何获取每个相关行的2条最新记录

Laravel 如何获取每个相关行的2条最新记录,laravel,laravel-5,eloquent,Laravel,Laravel 5,Eloquent,假设我有两张桌子: 用户:id、名称 Posts:id,user\u id,created\u at 我试图获得每个用户的2个最新帖子。我已正确设置了关系模型。起初我以为我可以使用->take(2),但这只会从整个查询中返回2行 这就是我现在拥有的: $user->load(['posts' => function($query) { $query->orderBy('id', 'desc'); }]); 这将返回每个用户的所有帖子。现在这真的不是问题,但如果用户有成

假设我有两张桌子:

用户:id、名称

Posts:id,user\u id,created\u at

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

这就是我现在拥有的:

$user->load(['posts' => function($query) {
    $query->orderBy('id', 'desc');
}]);
这将返回每个用户的所有帖子。现在这真的不是问题,但如果用户有成百上千的帖子,这将很快成为内存消耗

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

试试这个

注意:运行的查询数将是返回的用户数+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;
});
不幸的是,没有直接的方法来限制从关系返回的记录的数量

另一种方法是使用普通的旧SQL编写查询,这样您就可以在一个查询中完成查询


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

嗯,我正在努力决定最好的方法。我正在加载另外两个关系给用户,这两个关系在急切加载时非常有效,因此我可能不得不放弃所有这些关系,只需要创建一个更大的sql查询,并尝试一次性获取所有关系。好奇为什么会有人投反对票?如果有什么方法可以改进这个答案,我想知道(特别是因为OP接受了它)。