Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

noblemfd's avatar

How to add if statement to query builder

I have this query build I used to generate leave balance:

    $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);
                    })
                ->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();

This gives me the result:

LeaveCategory | applicableLeave | approvedLeave

But I want to add a condition to the applicableLeave

   $leaveprorates             = HrLeaveTypeDetail::select('is_prorate')->where('leave_type_id', $leavetypeid)->where('employee_type_id', $employeeemptypeid)->get();

  foreach( leaveprorates as leaveprorate)

      if ($leaveprorate == 1)
      {
        if ($diff_in_months < 12)
        {
            $applicableLeave = intval($authorizedleavedaysx * $diff_in_months / 12); 
        }else{
            $applicableLeave = HrLeaveTypeDetail::where('leave_type_id', $leaveType)->where('employee_type_id',$employeeemptypeid)->pluck('no_of_days')->first();
        }         
      }else{
            $applicableLeave = HrLeaveTypeDetail::where('leave_type_id', $leaveType)->where('employee_type_id',$employeeemptypeid)->pluck('no_of_days')->first();      
      }

How do I add this condition for applicableLeave in the query?

Thanks

0 likes
4 replies
Sinnbeck's avatar

You can use when in the query builder

->when($something, function ($query, $something) {
    $query->where('foo', $something)
})->where(...
Sinnbeck's avatar

Sorry but I cannot find heads or tails in your code. Can you show exactly where you expect what to be used?

noblemfd's avatar

@sinnbeck - What I mean is that:

since:

'ltd.no_of_days as applicableLeave',

then for:

            ->leftJoin('hr_leave_type_details AS ltd', function($join) use ($userCompany)
                {
                    $join->on('ltd.leave_type_id', '=', 'lt.id')
                    ->where('ltd.company_id', '=', $userCompany);
                })

this condition should apply:

  foreach( leaveprorates as leaveprorate)

  if ($leaveprorate == 1)
  {
    if ($diff_in_months < 12)
    {
        $applicableLeave = intval($authorizedleavedaysx * $diff_in_months / 12); 
    }else{
        $applicableLeave = HrLeaveTypeDetail::where('leave_type_id', $leaveType)->where('employee_type_id',$employeeemptypeid)->pluck('no_of_days')->first();
    }         
  }else{
        $applicableLeave = HrLeaveTypeDetail::where('leave_type_id', $leaveType)->where('employee_type_id',$employeeemptypeid)->pluck('no_of_days')->first();      
  }

Please or to participate in this conversation.