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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 11:59:36