Laravel中LIKE查询无法匹配预期数据库记录,求问题排查
问题分析与解决方法
你的查询逻辑完全搞反了,这是导致无结果的核心原因:
当前代码是查询name字段包含B-Frontliner的记录,但数据库里的两条记录B-Front和Frontliner,都只是B-Frontliner的一部分——反过来是B-Frontliner包含这两个值,而非name包含B-Frontliner。
正确的查询方式
以下两种方法都能实现你的需求(匹配所有name值被B-Frontliner包含的记录):
方法1:使用MySQL的LOCATE函数
$string = 'B-Frontliner'; $results = Artist::whereRaw("LOCATE(name, ?) > 0", [$string])->get();
LOCATE(name, ?)会返回name在目标字符串中的起始位置,大于0则表示存在匹配。
方法2:使用正则表达式匹配
$string = 'B-Frontliner'; $results = Artist::whereRaw("? REGEXP CONCAT('.*', name, '.*')", [$string])->get();
通过拼接正则规则,判断目标字符串是否包含任意一条name的值。
忽略大小写的处理
如果需要忽略大小写匹配,可以对字段和目标字符串统一转小写:
$results = Artist::whereRaw("LOCATE(LOWER(name), LOWER(?)) > 0", [$string])->get();
内容的提问来源于stack exchange,提问作者Hardist
相关产品推荐
相关产品推荐

