如何使用Laravel使用查询生成器在左连接中添加附加条件
我在Laravel-5.8中有一个雄辩的查询生成器:如何使用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', $
$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]