如何使用Laravel使用查询生成器在左连接中添加附加条件

如何使用Laravel使用查询生成器在左连接中添加附加条件,laravel,eloquent,query-builder,Laravel,Eloquent,Query Builder,我在Laravel-5.8中有一个雄辩的查询生成器: $userCompany = Auth::user()->company_id; $userEmployee = Auth::user()->employee_id; $employeeCode = Auth::user()->employee_code; $employeeemptypeid = HrEmployee::where('employee_code', $

我在Laravel-5.8中有一个雄辩的查询生成器:

$userCompany         = Auth::user()->company_id;    
$userEmployee        = Auth::user()->employee_id;
$employeeCode        = Auth::user()->employee_code;
$employeeemptypeid   = HrEmployee::where('employee_code', $employeeCode)
                            ->where('company_id', $userCompany)
                            ->pluck('employee_type_id')->first();
$employeeegendercode = HrEmployee::where('employee_code', $employeeCode)
                            ->where('company_id', $userCompany)
                            ->pluck('gender_code')->first(); 

$leaveBalance = DB::table('hr_leave_types AS lt')
                    ->leftJoin('hr_leave_type_details AS ltd', function($join) use ($userCompany) {
                        $join->on('ltd.leave_type_id', '=', 'lt.id')
                            ->where('ltd.company_id', '=', $userCompany)
                            ->where('ltd.employee_type_id', '=', $employeeemptypeid);
                    })
                    ->leftJoin('hr_leave_requests AS lr', function($join) use ($userCompany, $userEmployee) {
                        $join->on('lr.leave_type_id', '=', 'lt.id')
                            ->where('lr.company_id', '=', $userCompany)
                            ->where('lr.employee_id', '=', $userEmployee)
                            ->whereYear('lr.commencement_date', '=', date('Y'))
                            ->where('lr.leave_status', 4);
                    })                        
                    ->leftJoin('hr_employees AS e', function($join) use ($userCompany, $userEmployee) {
                        $join->on('e.id', '=', 'lr.employee_id')
                            ->where('e.company_id', '=', $userCompany)
                            ->where('e.id', '=', $userEmployee)
                            ->where('e.employee_type_id', '=', 'ltd.employee_type_id');
                    })
                    ->where('lt.company_id', '=', $userCompany)
                    ->select(
                        'lt.leave_type_name as leaveCategory',
                        'ltd.no_of_days as applicableLeave',
                        DB::raw("IFNULL(SUM(lr.no_of_days),0) as approvedLeave")
                    )
                    ->groupBy('lt.leave_type_name', 'e.id')
                    ->get();  
这用于获取员工休假余额。到目前为止,一切都很顺利

但也有一些休假类型只属于男性、女性,还有一些属于两性

如何将其添加到上述查询中:

if($employeeegendercode == 0) 
{
    $leavetypes = HrLeaveType::join('hr_leave_type_details', 'hr_leave_type_details.leave_type_id', '=', 'hr_leave_types.id')
                    ->select('hr_leave_types.id as id', 'hr_leave_types.leave_type_name')
                    ->where('hr_leave_types.company_id', $userCompany)
                    ->where('hr_leave_type_details.employee_type_id', $employeeemptypeid)
                    ->whereIn('hr_leave_type_details.leave_applicable_gender', [1, 3])
                    ->get();
}else{
    $leavetypes = HrLeaveType::join('hr_leave_type_details', 'hr_leave_type_details.leave_type_id', '=', 'hr_leave_types.id')
                    ->select('hr_leave_types.id as id', 'hr_leave_types.leave_type_name')
                    ->where('hr_leave_types.company_id', $userCompany)
                    ->where('hr_leave_type_details.employee_type_id', $employeeemptypeid)
                    ->whereIn('hr_leave_type_details.leave_applicable_gender', [1, 2])
                    ->get();
}
特别是:

hr_leave_type_details.leave_applicable_gender', [1, 3]


谢谢

您可以使用
when()
查询生成器函数

/**
*如果给定的“值”为true,则应用回调的查询更改。
*
*@param混合$value
*@param callable$callback
*@param callable |空$default
*@return mixed |$this
*/
当($value,$callback,$default=null)时的公共函数
{
如果(价值){
返回$callback($this,$value)?:$this;
}elseif($default){
返回$default($this,$value)?:$this;
}
退还$this;
}
以下是文档中的几个示例:

//如果$request->input('role')是truthy(在此上下文中,它不是null),
//然后使用$role变量筛选用户。
$role=$request->input('role');
$users=DB::表('users')
->when($role,function($query,$role){
返回$query->where('role\u id',$role);
})
->get();
//如果$sortBy不为null,则按$sortBy排序
//如果$sortBy为空,则按“名称”排序
$sortBy=null;
$users=DB::表('users')
->when($sortBy,function($query,$sortBy){
返回$query->orderBy($sortBy);
},函数($query){
返回$query->orderBy('name');
})
->get();
将此应用到您的示例中,我想您会得到以下结果:

$leavetypes=HrLeaveType::join('hr\u leave\u type\u details'、'hr\u leave\u type\u details.leave\u type\u id'、'='、'hr\u leave\u types.id')
->选择('hr\u leave\u types.id as id','hr\u leave\u types.leave\u type\u name')
->其中('hr\U休假类型。公司id',$userCompany)
->其中('hr\U休假类型\u详细信息。员工类型\u id',$employeeemptypeid)
->什么时候(
$EmployeeGenderCode==0,
函数($query){
返回$query->where('hr\u leave\u type\u details.leave\u applicative\u gender',[1,3]);
},
函数($query){
返回$query->where('hr\u leave\u type\u details.leave\u applicative\u gender',[1,2]);
}
)
->get();
为了弄清楚,我把凹痕放大了一点。对于这样相对较小的更改,可以使用PHP7.4的速记闭包

->当(
$EmployeeGenderCode==0,
fn($query)=>$query->其中('hr\u休假类型\u详情。休假\u适用性\u性别',[1,3]),
fn($query)=>$query->其中('hr\u休假类型\u详情。休假\u适用性\u性别',[1,2])
)
更多关于这个问题

您需要
加入
左加入
hr_leave_type_details.leave_applicable_gender', [1, 2]