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
相关产品推荐
相关产品推荐

