在我的 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 匹配的记录,它应该只显示工作地点的“未指定”而不是省略员工记录,我该怎么做?
谢谢。
答案 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'
)