Laravel Eloquent如何在单个where子句实现同字段多值判断
合并同字段多NOT LIKE条件的实现方案
你原来的链式写法默认通过AND逻辑拼接所有条件,要求mime_type同时不满足四个前缀匹配规则,可以直接合并为单个条件调用,筛选效果和原写法完全一致,最简洁的实现如下:
->whereRaw('mime_type NOT REGEXP ?', ['^(image|video|audio|application)'])
规则说明
- 正则中的
^表示从字符串起始位置开始匹配,(image|video|audio|application)匹配四个目标前缀中的任意一个,逻辑等价于你原来写的四个NOT LIKE 'xxx%'的AND组合,不会出现筛选结果差异。 - 写法采用参数绑定传参,不会引入SQL注入风险,符合Eloquent的编码规范。
- 由于是固定前缀匹配,只要
mime_type字段建立了普通索引,这个写法的查询性能和你原来的多个LIKE链式写法基本一致,不会出现性能下降。 - 如果你需要匹配标准MIME格式(前缀后必须跟斜杠,比如
image/png、video/mp4),可以把正则规则调整为'^(image|video|audio|application)/',避免误过滤类似imagecustom这类非标准前缀的记录。
适配提示:如果你使用的是PostgreSQL数据库,只需要把
NOT REGEXP替换为!~即可,正则匹配规则不需要改动;如果是SQLite数据库,NOT REGEXP语法可以直接使用,无需调整。
内容的提问来源于stack exchange,提问作者user19279473
相关产品推荐
相关产品推荐

