Outer Join,然后在 Laravel 中计算计数

问题描述 投票:0回答:1

我正在尝试在 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
部分的数据?

php laravel join case outer-join
1个回答
0
投票

您可以利用

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();
© www.soinside.com 2019 - 2024. All rights reserved.