I'm trying to calculate counts of relationship based on where conditions with help of CASE statement in my Laravel application.
I've a Project Model which has ManyToMany relationship with Professional Model. I've multiple where conditions to filter projects data. I need to calculated project count where I've verified professionals and reverse. I achieved this by following below query in my controller:
$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);
I want to optimise query and achieve with CASE statement, I tried below:
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();
How to get data for No section?