我列出了包含用户的组的简单列表。
$groups = Group::with(['users' => function ($query) {
$query->orderBy('last_login', 'ASC');
}])->get();
通过该代码,我获得了所有数据。
我的目标是限制每个列表中该列表中的最大用户数为10。问题是当我向代码添加 - > limit(10)时...我限制了所有组中的所有用户。因此,如果我有10个组,我将在每个组中获得1个用户。
$groups = Group::with(['users' => function ($query) {
$query->orderBy('last_login', 'ASC')->limit(10);
}])->get();
我的问题是如何将其限制为每组10个用户。
现在withound - > limit(10)我无法在foreach中获得我的结果...
@if ($loop->iteration == 10)
@break
@endif
但它在optymalization方面并不完美,因为我总是拥有所有用户并只显示10个。
答案 0 :(得分:0)
您必须使用offset或skip()方法:
$users = DB::table('users')
->offset(10)
->limit(5)
->get();
或
$users = DB::table('users')->skip(10)->take(5)->get();
在此示例中,offset / skip是您要跳过的行数,然后是接下来的5个值。在这种情况下,它将跳过前10个,并为您提供第10-15行的数据。您必须每次都将offset的值传递给控制器。
如果你不想做任何这些,你可以使用laravels分页:
$users = User::where('votes', '>', 100)->paginate(15);
15是您希望每页显示的数据数量。将此视图返回到您的视图,您将显示如下:
@foreach ($users as $user)
{{ $user->name }}
@endforeach
{{ $users->links() }}
这适用于larave 5. *,只需搜索您正在使用的版本的正确文档。
答案 1 :(得分:0)
实际上,尝试在数据库中执行1次查询以获取group by语句中每个组的前X个记录是一件很复杂的事情,通常通过使用变量,临时表,特殊函数,联合或其他类型来实现技巧。
然后,尝试通过绑定框架的数据模型来实现这一点,这进一步提高了复杂性。
我建议你做N + 1个查询(其中N将被限制为最大常数),其中N是你拥有的组数。
所以,这就是我的意思。
获取群组列表,这里确保您限制最大值,无论如何都不需要获取大量群组,这样您就可以确保不会出现性能下降提出太多疑问。
$group_list = Group::orderBy('somethingYouLikeHere')->limit(20)->get();
然后,您遍历该组列表以获取前X个用户:
$all_groups_data = [];
foreach ($group_list as $group) {
$users = User::where('group_id', $group->id)->orderBy('last_login', 'ASC')->limit(10)->get();
$all_groups_data[$group->id] = $users;
}
// You could also consider using a collection instead of an array
然后你去。
通常你更喜欢一个花哨的查询,它可以立即生成所有内容,但在这种情况下,最终可能会出现一个非常复杂的代码和查询,难以理解和解密。
有了这个,性能应该没问题,你可以用简短易读的代码得到结果。
我希望它有所帮助。
<强>更新强>
如果有很多组,您甚至可以对页面进行分页
要做到这一点,您只需要在第一个获取组的查询中使用paginate()
函数。