假设我有这两个表:
Users: id, name
Posts: id, user_id, created_at
我正在尝试获取每个用户的2个最新帖子。我正确设置了关系模型。起初我以为我可以使用->take(2)
,但只返回整个查询中的2行。
这就是我现在所拥有的:
$user->load(['posts' => function($query) {
$query->orderBy('id', 'desc');
}]);
这将返回每个用户的所有帖子。这真的不是一个问题,但如果用户有数百或数千个帖子,这将很快成为一个记忆力。
获得每个用户的最后2条记录的最佳方法是什么?希望使用预先加载?我可以通过获取每个用户的最后2条记录来轻松完成,但这个查询太多了。
答案 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或其他),但并非如此。 简单胜利。