【问题标题】:Laravel groupby min/max filter grouped resultsLaravel groupby 最小/最大过滤器分组结果
【发布时间】:2017-05-19 23:38:32
【问题描述】:

我有一个 Laravel 查询以我想要的方式使用 min()groupBy()

$certificates = CertificateRecord::whereHas('learner', function($query) use($user) { $query->where('user_id', '=', $user->id); })
->selectRaw('*,min(type) as type')
->groupBy('certificate_template_id')
->with('issuer','certificateType')
->paginate(10);

但是当我将它添加到组合中时......

->when($request->type, function ($query) use ($request) {
    return $query->where('type', '=', $request->type);
})

执行此where() 时以某种方式忽略先前分组的结果,并返回所有未分组的行。

【问题讨论】:

    标签: php mysql database laravel laravel-5.2


    【解决方案1】:

    编辑:带有when 条件位置的原始查询对我来说似乎很好。这应该过滤 type 字段而不影响 groupBy。我想告诉你的一件事是,当设置$request->type 时,结果集中只有一个type 值,因此最小值将保持不变。

    $certificates = CertificateRecord::whereHas('learner', function($query) use($user) {
        $query->where('user_id', '=', $user->id);
    })
        ->with('issuer', 'certificateType')
        ->when($request->type, function ($query) use ($request) {
            return $query->where('type', $request->type);
        })
        ->selectRaw('*, min(type) as type')
        ->groupBy('certificate_template_id')
        ->paginate(10);
    

    $certificates = CertificateRecord::whereHas('learner', function($query) use($user) {
            $query->where('user_id', '=', $user->id);
        })
        ->with('issuer', 'certificateType')
        ->selectRaw('*, min(type) as type')
        ->groupBy('certificate_template_id')
        ->when($request->type, function ($query) use ($request) {
            return $query->having('type', '=', $request->type);
        })
        ->paginate(10);
    

    如果这不起作用,请切换到 haveRaw。

    return $query->havingRaw('min(type) = ' . $request->type);
    

    【讨论】:

    • 我得到:Unknown column 'type' in 'having clause' (SQL: select count(*) as aggregate from 'certificate_records' where exists (select * from 'learners' where 'certificate_records'.'learner_id' = 'learners'.'id' and 'user_id' = 3) group by 'certificate_template_id' having 'type' = 1)Unknown column '1' in 'having clause' (SQL: select count(*) as aggregate from 'certificate_records' where exists (select * from 'learners' where 'certificate_records'.'learner_id' = 'learners'.'id' and 'user_id' = 3) group by 'certificate_template_id' having min(type) = 1)
    • @jerfbillings 我对答案进行了更新,老实说,原始查询加上 when 条件似乎很好。如果您能向我们展示带有和不带有它的结果集以及使用时 request->type 的值,将会很有帮助
    【解决方案2】:

    只是不要立即完成查询:

    $query = $certificates = CertificateRecord::whereHas('learner', function($query) use($user) { $query->where('user_id', '=', $user->id); })
    ->selectRaw('*,min(type) as type')
    ->groupBy('certificate_template_id')
    ->orderBy('type')
    ->with('issuer','certificateType')
    
    if ($request->status){ $query->where('status', '=', $request->status); }
    
    $query->paginate(10);
    

    【讨论】:

    • 但是这样做似乎会返回所有带有该条件的原始结果,忽略分组。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 2021-01-15
    • 1970-01-01
    相关资源
    最近更新 更多