Outer Join and then calculating the counts in Laravel

52 views Asked by At

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?

0

There are 0 answers