如何在Laravel中筛选已缴费(Paid)与未缴费(Not Paid)的学生
实现方案
你可以通过传入缴费状态参数,结合Laravel查询构造器的when方法动态拼接where/whereNot条件,修改后的代码如下:
// 新增接收的筛选参数:$paymentStatus 可选值为 paid(已缴费)/ not_paid(未缴费) $queryBuilder = Student::query() ->leftJoin('fee_scheem_maps', 'students.students_id', '=', 'fee_scheem_maps.sfc_student_id') ->leftJoin('fee_scheems', 'fee_scheem_maps.sfc_feescheem_id', '=', 'fee_scheems.fee_scheems_id') ->leftJoin('individual_fee_scheems', 'fee_scheem_maps.sifc_feescheem_id', '=', 'individual_fee_scheems.ifs_id') ->leftJoin('fee_groups', 'fee_scheems.fee_scheems_id', '=', 'fee_groups.fg_fee_scheem_id') ->leftJoin('school_fee_collectors', 'students.students_id', '=', 'school_fee_collectors.fc_student_id') // 动态处理缴费状态筛选 ->when($paymentStatus, function ($query) use ($paymentStatus, $fromDate) { // 已缴费:走正向where条件匹配对应缴费记录 if ($paymentStatus === 'paid') { return $query->where('school_fee_collectors.fc_fee_group_id', $fromDate); } // 未缴费:走反向条件,可根据业务需要选whereNot/whereNull等写法 if ($paymentStatus === 'not_paid') { // 写法1:直接用whereNot反向匹配正向条件(Laravel 6+以上版本支持) return $query->whereNot(function ($q) use ($fromDate) { $q->where('school_fee_collectors.fc_fee_group_id', $fromDate); }); // 写法2:针对left join场景直接判断关联字段为空,性能更优 // return $query->whereNull('school_fee_collectors.fc_fee_group_id'); } }) ->select('*', DB::raw('count(students_id) as total'));
如果筛选逻辑复杂需要复用,还可以把基础条件抽成独立闭包,避免重复编码:
// 抽离公共基础条件 $feeMatchCondition = function ($query) use ($fromDate) { return $query->where('school_fee_collectors.fc_fee_group_id', $fromDate); }; // 调用时动态选择正向/反向条件 $queryBuilder->when($paymentStatus === 'paid', $feeMatchCondition) ->when($paymentStatus === 'not_paid', fn($q) => $q->whereNot($feeMatchCondition));
内容的提问来源于stack exchange,提问作者Tharindu Gomas
相关产品推荐
相关产品推荐

