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

Laravel搜索API特殊字符处理:AB+血型查询失败问题

解决Laravel中GET参数含特殊字符+的查询问题

问题根源

HTTP协议中,URL参数里的+会被自动解析为空格。当你发起blood_group=AB+的请求时,Laravel的Request对象接收到的实际值是AB (AB加空格),这就导致数据库里存储的AB+无法被匹配到。

解决方案

方法1:直接获取未解码的参数

Laravel的query()方法支持第三个参数$decode,设置为false就能拿到原始未解码的参数值:

if ($request->has('blood_group')) {
    // 第三个参数false表示不自动解码URL编码字符
    $bloodGroup = $request->query('blood_group', '', false);
    $donorQuery->where('blood_group', $bloodGroup);
}

方法2:将解析后的空格替换回+

如果前端无法修改请求方式,可以在后端把接收到的空格手动替换为+:

if ($request->has('blood_group')) {
    $bloodGroup = str_replace(' ', '+', $request->blood_group);
    $donorQuery->where('blood_group', $bloodGroup);
}

额外优化:清理控制器冗余代码

你的控制器里存在重复的$donorQuery->get()调用,还有未使用的$TotaldonorList变量,可以精简为:

public function filter(Request $request)
{
    $donorQuery = Donor::where('status', 1);
  
    if ($request->has('address')) {
        $donorQuery->where('address', 'LIKE', '%' . $request->address . '%');
    }
    if ($request->has('blood_group')) {
        // 这里用上面的任意一种方法处理blood_group
        $bloodGroup = $request->query('blood_group', '', false);
        $donorQuery->where('blood_group', $bloodGroup);
    }

    $donorList = $donorQuery->get();
    $data = [
        'donors' => $donorList,
        'message' => 'Donors List',
        'total_filtered' => $donorList->count(), // 过滤后的数量
        'total_active' => Donor::where('status', 1)->count(), // 所有活跃捐赠者数量
        'total_all' => Donor::count() // 所有捐赠者数量
    ];

    return response()->json($data, 200);
}

内容的提问来源于stack exchange,提问作者saroj sardar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 19:20:30