Laravel groupby min/max 过滤分组结果
Laravel groupby min/max filter grouped results
我有一个 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()
时,先前分组的结果以某种方式被忽略,并且 returns 所有未分组的行。
只是不要立即完成查询:
$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);
编辑:when
条件放置的原始查询对我来说似乎没问题。这应该在不影响 groupBy 的情况下过滤 type
字段。我想告诉你的一件事是当设置$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);
如果这不起作用,请切换到 havingRaw。
return $query->havingRaw('min(type) = ' . $request->type);
我有一个 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()
时,先前分组的结果以某种方式被忽略,并且 returns 所有未分组的行。
只是不要立即完成查询:
$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);
编辑:when
条件放置的原始查询对我来说似乎没问题。这应该在不影响 groupBy 的情况下过滤 type
字段。我想告诉你的一件事是当设置$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);
如果这不起作用,请切换到 havingRaw。
return $query->havingRaw('min(type) = ' . $request->type);