渴望加载每组用户限制

时间:2016-09-16 18:10:27

标签: php laravel laravel-5

我列出了包含用户的组的简单列表。

$groups = Group::with(['users' => function ($query) {
        $query->orderBy('last_login', 'ASC');
}])->get();

通过该代码,我获得了所有数据。

enter image description here

我的目标是限制每个列表中该列表中的最大用户数为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个。

enter image description here

2 个答案:

答案 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. *,只需搜索您正在使用的版本的正确文档。

Laravel Pagination Doc

Laravel 5.3 Skip Doc

答案 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()函数。