当前位置: 首页 > 知识库问答 >
问题:

Laravel分页不适用于group by子句

章睿
2023-03-14

似乎Laravel分页DEO与group by子句不能正常工作。例如:

            $users = Subject::select(DB::raw('subjects.*, count(user_subjects.id) as total_users'))
            ->join('user_subjects', 'user_subjects.subject_id', '=', 'subjects.id')
            ->whereNull('user_subjects.deleted_at')
            ->groupBy('subjects.id')
            ->orderBy('subjects.updated_at', 'desc')
            ->paginate(25);

产生

            select subjects.*, count(user_subjects.id) as total_users 
            from `subjects` inner join `user_subjects` on `user_subjects`.`subject_id` = `subjects`.`id` 
            where `subjects`.`deleted_at` is null and `user_subjects`.`deleted_at` is null 
            group by `subjects`.`id` 
            order by `subjects`.`updated_at` desc

请注意,查询上没有限制子句。

如果查询中没有group by子句,则工作罚款:

$users = Subject::select(DB::raw('subjects.*, count(user_subjects.id) as total_users'))
            ->join('user_subjects', 'user_subjects.subject_id', '=', 'subjects.id')
            ->whereNull('user_subjects.deleted_at')
            ->orderBy('subjects.updated_at', 'desc')
            ->paginate(25);

产生了以下查询:

select subjects.*, count(user_subjects.id) as total_users from `subjects` 
            inner join `user_subjects` on `user_subjects`.`subject_id` = `subjects`.`id`
            where `subjects`.`deleted_at` is null and `user_subjects`.`deleted_at` is null 
            order by `subjects`.`updated_at` desc 
            limit 25 offset 0

有人知道我该怎么解决这个问题吗?

共有3个答案

经俊茂
2023-03-14

这在laravel 5.2中对我有用

Select(\DB::RAW("assignment_descendant_child.assignment_descendant_child_id, assignment_descendant_child.assignment_descendant_child_name, COUNT(assignment_descendant.assignment_descendant_id) as xNum"))
            ->leftJoin(
                'assignment_descendant',
                'assignment_descendant.assignment_descendant_child_id',
                '=',
                'assignment_descendant_child.assignment_descendant_child_id'
            )
            ->orderBy('assignment_descendant_child_name')
            ->groupBy('assignment_descendant_child.assignment_descendant_child_id')
            ->paginate(\Config::get('constants.paginate_org_index'))
汤玉宸
2023-03-14

我知道这是一个老问题,因为我正在分享我的解决方案供将来参考。

我设法基于这个链接编写了一个函数,它完成了确定复杂查询分页的繁重工作。只需传递'QueryBuilder',它将返回分页对象/集合。

此外,此过程可以跟踪和维护除page=之外的其他参数。

public function mergeQueryPaginate(\Illuminate\Database\Eloquent\Builder $query): \Illuminate\Pagination\LengthAwarePaginator
    {
        $raw_query = $query;
        $totalCount = $raw_query->get()->count();

        $perPage = request('per-page', 10);
        $page = request('page', 1);
        $skip = $perPage * ($page - 1);
        $raw_query = $raw_query->take($perPage)->skip($skip);

        $parameters = request()->getQueryString();
        $parameters = preg_replace('/&page(=[^&]*)?|^page(=[^&]*)?&?/', '', $parameters);
        $path = url(request()->getPathInfo() . '?' . $parameters);

        $rows = $raw_query->get();

        $paginator = new LengthAwarePaginator($rows, $totalCount, $perPage, $page);
        $paginator = $paginator->withPath($path);
        return $paginator;
    }
濮阳原
2023-03-14

检查留档https://laravel.com/docs/5.2/pagination

目前,Laravel无法有效执行使用groupBy语句的分页操作。如果需要对分页结果集使用groupBy,建议您查询数据库并手动创建分页器。

 类似资料:
  • 问题内容: 我通过AJAX和WordPress分页加载了一些帖子,并使用以下函数来计算分页: 问题是通过AJAX创建了分页,因此使此链接看起来像: 但是,我想要达到的实际URL就是为此: 有没有办法在AJAX上使用此功能,并且仍然获得正确的分页URL? 问题答案: 我可以为您想到三个选择: 编写自己的版本将允许您指定基本URL 在调用时覆盖变量 要调用该函数,请返回整个分页的HTML,然后使用JS

  • 本文向大家介绍MvcPager分页控件 适用于Bootstrap,包括了MvcPager分页控件 适用于Bootstrap的使用技巧和注意事项,需要的朋友参考一下 软件开发分页效果必不可少,对于Asp.Net MVC 而言,MvcPager 是个不错的选择。 请访问http://www.webdiyer.com/mvcpager/ 由于自带的分页样式不能和项目整体风格兼容,所以我们准备改写源代码,

  • 我一直在发疯,想弄明白为什么最终的android改造没有发送帖子。这就是我所做的。在Laravel中,我设置了模型controller,更改了VerifyCsrfToken以允许api。然后设置路由web和api。所有这些都是通过邮递员测试的,而且都是有效的,但当我尝试通过android发布时,代码失败了。 这是我给Laravel的路线 网状物php 应用程序编程接口。php Androidapi

  • 错误在此输入图像描述 我试图发送事件的通知,当一些喜欢和评论他的帖子,通知评论和喜欢在这里工作是我的通知类。 我的控制器功能代码,用于通知评论 我的请求

  • Artemis 1.2.0独立代理conf: 行为:分页工作。 客户端:artemis-jms-client v1.2.0 类:org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory 类:org.apache.activeMQ.ActiveMQConnectionFactory 这是虫子还是我只是煮错了?

  • 我有一个智能表,我正在AngularJS工作。该表使用自定义管道来搜索和排序其数据。我还要求表具有工作分页,以及一个下拉框,以便您可以选择要显示的行数(想想数据)。 对于搜索和排序,自定义管道可以毫无问题地触发我的ajax请求。但是,当我单击任何页码或更改要显示的行数时,管道不会被触发。 页码似乎被设置为调用setPage(page)(这是由st pagination指令设置的),但是什么也没有发