使用分页器的时候,若 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
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 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 对象, 手动分页

5年前 评论

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

5年前 评论

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