Laravel实现含空生日字段的年龄+职业筛选批量短信功能
解决Laravel批量短信筛选逻辑问题
针对你提出的筛选需求,需要修改SmsController中的send_sms_bulk方法,调整查询逻辑以满足以下要求:
- 同时设置年龄范围和职业时,筛选符合年龄范围且职业匹配 + 无生日信息且职业匹配的用户
- 无生日信息的用户仅按职业筛选
原代码存在的问题
- 未从请求中正确获取
occupation参数,导致职业筛选失效 - 年龄筛选仅保留了有生日且在范围内的用户,未包含无生日但职业匹配的用户
- 查询逻辑未覆盖需求中的两种情况
修改后的完整代码
public function send_sms_bulk(Request $request){ // 请求参数验证 $request->validate([ 'occupation' => 'required', 'age_range' => 'nullable|string', 'message' => 'required|string', ]); $query = Contact::query(); $occupation = $request->occupation; // 先添加职业筛选(必填项) $query->where('occupation', $occupation); // 处理年龄范围筛选 if ($request->has('age_range')) { $age = explode(';', $request->age_range); $startDate = now()->subYears($age[0]); $endDate = now()->subYears($age[1])->subDay(); // 核心逻辑:符合年龄范围 或者 无生日信息 $query->where(function ($q) use ($startDate, $endDate) { $q->whereBetween('birthday', [$endDate, $startDate]) ->orWhereNull('birthday'); }); } $contacts = $query->get(); foreach($contacts as $contact) { $this->sms_gate_request($contact->country_code.$contact->phone_number, $request->message, $contact->id); } return back()->with('success', '批量短信发送任务已启动'); }
逻辑说明
- 职业筛选:因为视图中职业是必填项,所以先统一添加职业匹配条件,确保所有结果都符合职业要求
- 年龄范围处理:当用户设置了年龄范围时,通过闭包组合两个条件:
whereBetween('birthday', [$endDate, $startDate]):筛选有生日且年龄在指定范围内的用户orWhereNull('birthday'):筛选无生日信息的用户
两者结合即可覆盖需求中的第一种场景
- 无年龄范围时:仅保留职业筛选条件,自动包含该职业下所有用户(无论是否有生日),满足第二种需求
内容的提问来源于stack exchange,提问作者Lordp
相关产品推荐
相关产品推荐

