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

时间:2016-01-04 23:57:21

标签: laravel laravel-5 eloquent

假设我有这两个表:

Users: id, name

Posts: id, user_id, created_at

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

这就是我现在所拥有的:

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

这将返回每个用户的所有帖子。这真的不是一个问题,但如果用户有数百或数千个帖子,这将很快成为一个记忆力。

获得每个用户的最后2条记录的最佳方法是什么?希望使用预先加载?我可以通过获取每个用户的最后2条记录来轻松完成,但这个查询太多了。

1 个答案:

答案 0 :(得分:-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的框架,我们必须使用它,否则我们就会做错了#34;错误"并且它不是" Laravel方式" (或者我们可能使用的任何框架,PHP或其他),但并非如此。 简单胜利。