使用分页器的时候,若 select 语句包含聚合函数,则无法正常 select

运行以下语句,会报错。

$builder->select([
            \DB::raw("case when /* some condition */ then /* do something */ else /* do another thing */ end field_1"),
            \DB::raw("count(1) field_2")
        ])->groupBy('field_1')
        ->paginate();

Unknown column 'field_1' in 'group statement' (SQL: select count(*) as aggregate from table where is_enable = 1 group by field_1)

Long2Ge
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 2
/**
 * 获取分组分页对象
 * @param \Illuminate\Database\Eloquent\Builder $builder
 * @param array $columns [查询字段]
 * @param int $perPage [每页显示数]
 * @param string $pageName [页码名称]
 * @param int $page [页码]
 * @return LengthAwarePaginator
 */
public function getGroupPage($builder, $columns = ['*'], $perPage = 0, $pageName = 'page', $page = 0)
{
    // 分页参数
    $page = $page ?: LengthAwarePaginator::resolveCurrentPage($pageName);
    $perPage = $perPage ?: $this->perPage;

    // 取出总记录数
    $builderPage = clone $builder;

    // 分组sql
    $groupSql = $builder->select($columns)->toSql();

    // 分组sql获取参数
    $bindings = $builder->getQuery()->getConnection()->prepareBindings($builder->getBindings());

    // 获取总记录数
    $totalSql = "select count(1) as num from ({$groupSql}) as t";
    $total = \DB::Connection($builder->getModel()->getConnectionName())->select($totalSql, $bindings);
    $total = !empty($total[0]) ? $total[0]->num : 0;

    // 获取分页数据
    $results = $total > 0 ? $builderPage->forPage($page, $perPage)->get($columns)->all() : collect();

    // 分页数据处理
    return new LengthAwarePaginator($results, $total, $perPage, $page, [
        'path' => LengthAwarePaginator::resolveCurrentPath(),  // 路径
        'pageName' => 'page',
    ]);
}

传入 $builder 对象, 手动分页

4年前 评论

使用分组数据库配置(strict 设置为false,关闭严格模式)
\DB::setDefaultConnection('group_by');
file

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!