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

Laravel查询问题:数字片段匹配失败与布尔false查询无结果

问题分析与修复方案

一、id列输入'182'无法搜索到结果的原因及解决

原因

你的代码逻辑中,当输入值被is_numeric($v)判定为数字时(比如'182'),会进入whereIn分支,将值转为整数后执行精确匹配:

if( is_numeric( $v) ) {
    $whereIn[] = [$k, (int) $v];
}
// 后续执行
$search->whereIn($key, [$value]);

但你的id列存储的是混合类型:纯整数、纯字符串、带数字的字符串(如'PPAETRABN018283')。whereIn是精确匹配,且要求类型一致,带数字的字符串本质是字符串类型,和整数182无法匹配,同时也不会像LIKE那样做模糊匹配,因此输入'182'时无法找到结果。

修复方案

如果需要对id列的混合类型做模糊搜索,让数字输入也走LIKE分支即可,可针对id字段单独处理:

foreach( $trimmed_array as $k => $v ) {
    if( $k !== 'page' && $k !== 'projectToken' && $k !== 'userId' ) {
        if( !empty( $v ) )  {
            // 针对id字段,无论输入是否为数字,都用LIKE模糊搜索
            if($k === 'id') {
                $whereLike[] = [$k, 'LIKE', '%'. $v .'%' ];
            } elseif( trim( strtolower($v)) == 'false' || trim(strtolower($v)) == 'true') {
                $where[] = [$k, $v ];
            } else {
                // 其他字段保留原逻辑
                if( is_numeric( $v) ) {
                    $whereIn[] = [$k, (int) $v];
                } else {
                    $whereLike[] = [$k, 'LIKE', '%'. $v .'%' ];
                }
            }
        }
    }            
}

二、availability列输入'false'无法搜索到结果的原因及解决

原因

代码中处理布尔值输入时,直接将字符串强制转为布尔类型:

$value = (bool) $arr[1];

在PHP规则中,所有非空字符串强制转为布尔值时都会得到true,哪怕字符串内容是'false'。因此输入'false'时,实际执行的是where('availability', true),自然搜不到存储为false的数据。

修复方案

根据字符串内容手动转换为正确的布尔值:

if( count( $where ) ) {
    foreach( $where as $arr ) {
        $key = $arr[0];
        // 根据字符串内容判断布尔值
        $value = trim(strtolower($arr[1])) === 'true' ? true : false;
        $search->where($key, $value);
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 20:55:23