Laravel控制器查询需求:如何实现指定值不在逗号分隔字段中时排除对应记录
Laravel控制器查询需求:如何实现指定值不在逗号分隔字段中时排除对应记录
嘿,我懂你的纠结——一开始看到逗号分隔的字符串字段,很容易下意识想写循环去拆分判断,但其实完全不用这么麻烦,咱们靠SQL内置函数或者Laravel查询构造器就能直接搞定!
先说说你当前代码的问题:orWhere('Other OE Referances', '=', $find)只会匹配字段完全等于$find的情况,但你的字段里是多个带空格的逗号分隔值,这条条件基本不会命中你想要的记录。
下面给你两个实用的解决方案:
方案一:用FIND_IN_SET函数(推荐)
SQL的FIND_IN_SET函数专门用来判断某个值是否在逗号分隔的字符串里,但要先处理掉字段里的空格才能正常工作。代码如下:
$find = 'G060162A2'; $letsFind = DB::table('parts') ->where('OE Number', '=', $find) ->orWhereRaw("FIND_IN_SET(?, REPLACE(`Other OE Referances`, ' ', ''))", [$find]) ->get();
解释:
REPLACE(Other OE Referances, ' ', '')会把字段里所有空格清除,把类似"83222152426 ,83222289720, 83222305397"的字符串转成"83222152426,83222289720,83222305397"FIND_IN_SET(?, ...)会判断$find是否在处理后的逗号分隔列表里,返回大于0的数就表示存在
方案二:模糊匹配(适合不想用原生SQL的场景)
如果不想写原生SQL语句,也可以用模糊匹配,但要注意处理字段里的空格,同时避免部分匹配的问题(比如别让G060162A2误匹配到G060162A2X):
$find = 'G060162A2'; $letsFind = DB::table('parts') ->where('OE Number', '=', $find) ->orWhere(function($query) use ($find) { // 匹配字段开头就是目标值的情况 $query->where('Other OE Referances', 'LIKE', "{$find}, %") // 匹配字段中间包含目标值的情况 ->orWhere('Other OE Referances', 'LIKE', "%, {$find}, %") // 匹配字段结尾就是目标值的情况 ->orWhere('Other OE Referances', 'LIKE', "%, {$find}") // 匹配字段只有目标值的情况 ->orWhere('Other OE Referances', '=', $find); }) ->get();
小建议:
从长远来看,逗号分隔的字段其实不符合数据库设计范式,查询效率也偏低。如果项目允许的话,建议新建一个关联表(比如part_oe_references),把每个OE编号单独存成一条记录,这样用Laravel的关联查询会更优雅,性能也更好。
内容来源于stack exchange
相关产品推荐
相关产品推荐

