如何在Eloquent Where子句中使用类似通配符语法实现多字符串匹配查询
解决Laravel查询中匹配多个状态的需求
嘿,我来帮你搞定这个查询需求!你之前用LIKE '%New%'做模糊匹配,但其实你要的是精确匹配两种明确的状态值,这里有两种更合适的方案:
方案一:用whereIn实现简洁的多值匹配
这是最推荐的写法,专门对应“匹配多个明确值”的场景,代码简洁且逻辑清晰:
$requests = DB::table('requests') ->select('requestDate','requestTime','status','requestID') ->where('requestorID', '=', $userID) ->whereIn('status', ['New', 'Scheduled']) // 传入要匹配的状态数组 ->get();
这个方法会生成SQL:
WHERE requestorID = ? AND status IN ('New', 'Scheduled')
它比LIKE更精准——不会误匹配类似NewPending这种包含"New"的其他状态,完全符合你要筛选New或Scheduled的需求。
方案二:用闭包+orWhere实现OR逻辑
如果以后你需要给这两个状态添加更复杂的附加条件,可以用闭包把OR逻辑包裹起来,避免和其他查询条件冲突:
$requests = DB::table('requests') ->select('requestDate','requestTime','status','requestID') ->where('requestorID', '=', $userID) ->where(function ($query) { $query->where('status', 'New') ->orWhere('status', 'Scheduled'); }) ->get();
生成的SQL是:
WHERE requestorID = ? AND (status = 'New' OR status = 'Scheduled')
这种写法的优势是逻辑隔离,后续如果要给New状态加额外筛选(比如where('requestDate', '>', now())),直接在闭包里加就行,不会影响外层的查询条件。
最后提醒一下:尽量别用LIKE来匹配明确的枚举值,模糊匹配不仅效率低,还容易带来意料之外的结果,精确匹配才是这里的最优解~
内容的提问来源于stack exchange,提问作者Convert.ToInt32
相关产品推荐
相关产品推荐

