You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel实现含空生日字段的年龄+职业筛选批量短信功能

解决Laravel批量短信筛选逻辑问题

针对你提出的筛选需求,需要修改SmsController中的send_sms_bulk方法,调整查询逻辑以满足以下要求:

  1. 同时设置年龄范围和职业时,筛选符合年龄范围且职业匹配 + 无生日信息且职业匹配的用户
  2. 无生日信息的用户仅按职业筛选

原代码存在的问题

  1. 未从请求中正确获取occupation参数,导致职业筛选失效
  2. 年龄筛选仅保留了有生日且在范围内的用户,未包含无生日但职业匹配的用户
  3. 查询逻辑未覆盖需求中的两种情况

修改后的完整代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 16:24:52