Laravel API高级搜索异常:单关键词查询返回全表数据
嘿,我找到你这个搜索问题的症结啦!
你的代码在输入单个关键词时返回所有数据,核心问题出在循环里错误地把数组的数字索引和字符串参数名做比较了。
你看哦,PHP里用!=比较数字和字符串时,会自动把字符串转成数字。像'limit'、'order'这些字符串转成数字都是0。当你输入单个关键词比如"Dove"时,$input数组的索引$key是0,这时候$key != 'limit'就相当于0 != 0,结果是false——这直接导致你的代码没添加任何WHERE条件,查询自然就返回表中所有数据了。
而输入多个关键词时,比如第二个词的索引是1,1 != 0(也就是'limit'转成的数字)结果是true,所以能正常添加搜索条件,结果就没问题。
给你两种修复方案,挑适合你的来用:
方案一:直接过滤空关键词(最推荐)
因为拆分关键词时如果输入有多个空格,可能会产生空字符串元素,先把这些空值过滤掉,同时删掉那个错误的索引判断:
$response = strtolower(trim($request->input('data'))); // 拆分后过滤掉空的关键词 $input = array_filter(explode(" ", $response)); $items = Items::where(function ($query) use ($input) { foreach ($input as $search) { $query->where('name', 'LIKE', '%' . $search . '%'); } })->get(); // 别忘调用get()或者paginate()来执行查询哦!
方案二:如果确实要处理请求参数(其实这里没必要)
你原来的代码里好像想排除limit、order这些请求参数,但实际上这些参数根本不在$input数组里——因为$input是从request->input('data')拆分出来的。如果真要处理整个请求的参数,得单独做,但针对这个搜索场景,方案一更合适。
另外给你个小优化建议:如果想要任意一个关键词匹配就返回结果(而不是所有关键词都要匹配),可以把循环里的where改成orWhere就行。
内容的提问来源于stack exchange,提问作者ashfixed
相关产品推荐
相关产品推荐

