Laravel Eloquent多词多字段搜索:调整SQL条件连接逻辑
解决Laravel多关键词搜索的条件分组问题
我明白你的需求了——你想要实现每个搜索关键词都要匹配firstname/lastname/cardset中的至少一个字段,也就是把每个关键词对应的OR条件组用AND连接起来。
你之前的代码问题在于,所有的orWhere都被放在了同一个闭包里,导致最终SQL里所有条件都是OR关系。要实现分组AND的效果,你需要给每个搜索关键词单独创建一个闭包,每个闭包里放该关键词对应的三个OR条件:
$searchString = $request->searchstring; $searchValues = preg_split('/\s+/', $searchString, -1, PREG_SPLIT_NO_EMPTY); // 先初始化查询构造器 $cardsQuery = Card::query(); // 遍历每个搜索值,为每个值添加一个独立的条件组 foreach ($searchValues as $value) { $cardsQuery->where(function ($q) use ($value) { $q->orWhere('firstname', 'like', "%{$value}%") ->orWhere('lastname', 'like', "%{$value}%") ->orWhere('cardset', 'like', "%{$value}%"); }); } // 执行分页查询 $cards = $cardsQuery->paginate(24);
为什么这样能行?
Laravel的查询构造器中,每个where()闭包都会被当作一个独立的条件组,闭包内部的orWhere只会作用于组内的字段。而不同闭包之间的条件默认是用AND连接的,这样就刚好生成了你期望的SQL结构:
select * from "cards" where ("firstname" like ? or "lastname" like ? or "cardset" like ?) AND ("firstname" like ? or "lastname" like ? or "cardset" like ?)
这样修改后,只有当一条记录同时满足所有搜索关键词的条件(每个关键词匹配三个字段中的至少一个)时,才会被筛选出来,完全符合你的需求。
内容的提问来源于stack exchange,提问作者rubendn
相关产品推荐
相关产品推荐

