我正在尝试在 Laravel 应用程序中的
CASE
语句的帮助下根据 where 条件计算关系计数。
我有一个
Project
模型,与 ManyToMany
模型有 Professional
关系。我有多个 where 条件来过滤项目数据。我需要计算已验证专业人员的项目数量并进行反向计算。我通过在控制器中执行以下查询来实现此目的:
$projects = Project::wherehas('professionals',function ($q){
$q->where('professionals.contact_verified', 1);
$q->where('professionals.professional_active', 1);
})->get();
return response()->json(['data' => collect([
['id' => 1, 'name' => 'Yes'],
['id' => 2, 'name' => 'No']
])->map(function ($item) use($projects) {
if ($item['name'] == 'Yes')
$item['projects_count'] = Project::whereHas('professionals', function ($q) {
$q->where('professionals.contact_verified', 1);
$q->where('professionals.professional_active', 1);
})->count();
if ($item['name'] == 'No')
$item['projects_count'] = Project::whereHas('professionals', function ($q) use($projects){
$q->whereNotIn('project_professional.project_id',collect($projects)->pluck('id'));
})->count();
return $item;
})], 200);
我想优化查询并使用
CASE
语句实现,我尝试如下:
Project::where(// some condtions)
->leftJoin('project_professional', 'projects.id', 'project_professional.project_id')
->join('professionals', 'project_professional.professional_id', 'professionals.id')
->select(
DB::Raw('COUNT(DISTINCT CASE WHEN professionals.contact_verified = 1 AND professionals.professional_active = 1 THEN projects.id END) AS "Yes"'),
//want to count reverse of above condition
)
->first();
如何获取
No
部分的数据?
您可以利用
ELSE
语句中的 CASE
子句来计算“否”部分(条件相反)的计数。
$projectsCount = Project::where(// your conditions)
->leftJoin('project_professional', 'projects.id', 'project_professional.project_id')
->join('professionals', 'project_professional.professional_id', 'professionals.id')
->select(
DB::raw('COUNT(DISTINCT CASE WHEN professionals.contact_verified = 1 AND professionals.professional_active = 1 THEN projects.id END) AS Yes'),
DB::raw('COUNT(DISTINCT CASE WHEN NOT (professionals.contact_verified = 1 AND professionals.professional_active = 1) THEN projects.id END) AS No')
)
->first();