Laravel - 查询未给出预期结果

时间:2021-02-26 14:20:23

标签: laravel

在我的 Laravel-5.8 中,我有这个查询:

$identities = DB::table('appraisal_identity')->select('id')->where('is_current', 1)->pluck('id');
$userCompany = Auth::user()->company_id;

    $my_query = DB::table('hr_employees AS e')
                ->leftJoin('appraisal_goals AS a', function($join) use ($identities)
                    {
                        $join->on('a.employee_id', '=', 'e.id')
                        ->where('a.appraisal_identity_id', '=', $identities)
                        ->where('a.is_visible', '=', 1)
                        ->where('a.is_special_project', '=', 0)                                    
                        ->whereNull('a.deleted_at');
                    })
                ->join('hr_departments AS d', function($join) use ($userCompany)
                    {
                        $join->on('e.department_id', '=', 'd.id')
                        ->where('d.company_id', '=', $userCompany);
                    })                        
                ->join('hr_work_locations AS l', function($join) use ($userCompany)
                    {
                        $join->on('l.id', '=', 'e.work_location_id')
                        ->where('l.company_id', '=', $userCompany);
                    })  
                ->join('hr_employee_types AS et', function($join) use ($userCompany)
                    {
                        $join->on('et.id', '=', 'e.employee_type_id')
                        ->where('et.company_id', '=', $userCompany)
            ->where('et.include_appraisal', '=', 1);
                    })                         
                ->leftJoin('hr_employees AS em', function($join) use ($userCompany)
                    {
                        $join->on('em.employee_code', '=', 'e.line_manager_id')
                        ->where('em.company_id', '=', $userCompany)
                        ->where('em.hr_status', '=', '0');
                    }) 
                ->leftJoin('hr_employees AS emm', function($join) use ($userCompany)
                    {
                        $join->on('emm.employee_code', '=', 'em.line_manager_id')
                        ->where('emm.company_id', '=', $userCompany)
                        ->where('emm.hr_status', '=', '0');
                    })                        
                ->leftJoin('hr_employees AS eh', function($join) use ($userCompany)
                    {
                        $join->on('eh.employee_code', '=', 'd.hr_business_partner_id')
                        ->where('eh.company_id', '=', $userCompany)
                        ->where('eh.hr_status', '=', '0');
                    })    
                    ->where('e.company_id', '=', $userCompany)
                    ->where('e.hr_status', '=', '0')
        ->whereIn('e.employee_code', [2, 3])
                ->select(
                        'e.employee_code',
                        DB::raw('CONCAT(e.first_name, " ", e.last_name) AS fullname'),
                        'e.email',
            DB::raw('(CASE WHEN a.is_approved = 0 THEN "DRAFT" WHEN a.is_approved = 1 THEN "AWAITING APPROVAL" WHEN a.is_approved = 2 THEN "NOT APPROVED" WHEN a.is_approved = 3 THEN "APPROVED" ELSE "NOT STARTED" END) AS is_approved'),
                        DB::raw('(CASE WHEN a.line_manager_mid_year_approved = 0 THEN "DRAFT" WHEN a.line_manager_mid_year_approved = 1 THEN "AWAITING APPROVAL" WHEN a.line_manager_mid_year_approved = 2 THEN "NOT APPROVED" WHEN a.line_manager_mid_year_approved = 3 THEN "APPROVED" ELSE "NOT STARTED" END) AS line_manager_mid_year_approved'),
                        DB::raw('(CASE WHEN a.line_manager_year_end_approved = 0 THEN "DRAFT" WHEN a.line_manager_year_end_approved = 1 THEN "AWAITING APPROVAL" WHEN a.line_manager_year_end_approved = 2 THEN "NOT APPROVED" WHEN a.line_manager_year_end_approved = 3 THEN "APPROVED" ELSE "NOT STARTED" END) AS line_manager_year_end_approved'),
                        'd.dept_name',
                        'l.location_name',
                        'e.grade_level_name',
                        DB::raw('CONCAT(em.first_name, " ", em.last_name) AS manager'),
                        'em.email AS manager_email',
                        DB::raw('CONCAT(emm.first_name, " ", emm.last_name) AS manager_manager'),
                        DB::raw('CONCAT(eh.first_name, " ", eh.last_name) AS hrbp')
                       )
                ->distinct()
                ->get(); 

从上面的查询中,我想显示所有员工,无论记录是否匹配。然后,比较匹配的记录。

现在的问题是,当任何员工的 work_location_id 没有匹配的记录时:

->join('hr_work_locations AS l', function($join) use ($userCompany)
   {
     $join->on('l.id', '=', 'e.work_location_id')
     ->where('l.company_id', '=', $userCompany);
   }) 

它不会将员工详细信息添加到结果列表中。但我希望所有员工要么有匹配记录,要么没有。

如果没有与 work_location_id 匹配的记录,它应该只显示工作地点的“未指定”而不是省略员工记录,我该怎么做?

谢谢。

1 个答案:

答案 0 :(得分:0)

您需要在 hr_work_locations 上使用左联接而不是内联接。

->leftJoin('hr_work_locations AS l', function($join) use ($userCompany)
   {
     $join->on('l.id', '=', 'e.work_location_id')
     ->where('l.company_id', '=', $userCompany);
   })

如果您使用的是 Mysql 数据库,那么您可以使用 coalesce 如果位置表中的位置为空或缺少记录,或者您可以在应用程序级代码中处理它

DB::raw('coalesce(l.location_name,"Not Specified") as location_name')

喜欢

->select( //.. other columns
        'd.dept_name',
        DB::raw('coalesce(l.location_name,"Not Specified") as location_name'),
        'e.grade_level_name'
       )