如何让Eloquent的pluck()方法支持用户空输入正常通过查询?
过敏原筛选空输入问题修复方案
问题根源
- 原有代码存在两处错误:
- 闭包内的LIKE条件硬编码为
%specificallerg%,没有实际传入用户输入的过敏原变量,空输入时%%会匹配所有食材条目,whereDoesntHave逻辑会排除所有关联了食材的食谱,最终返回空数组。 - 没有做过敏原输入非空判断,空输入时也执行了无意义的排除逻辑。
- 闭包内的LIKE条件硬编码为
无if语句的解决方法
用Laravel内置的when条件查询方法,可在查询链内直接做条件判断,不需要拆分查询逻辑,修正后的代码如下:
$suited = $request->suitable_for; $specificallerg = $request->specific_allergen; $recipenew = Recipe::where('recipe.suitable_for', $suited) // 仅当过敏原输入不为空时执行排除逻辑 ->when(filled($specificallerg), function ($query) use ($specificallerg) { $query->whereDoesntHave('ingredients', function($qb) use ($specificallerg) { // 正确传入用户输入的过敏原变量 $qb->where('recipeingredientsmain.ingredientname', 'like', "%{$specificallerg}%"); }); }) ->pluck('id');
补充说明
filled()是Laravel 5.5+提供的辅助函数,用于判断值为非空、非空字符串、非null,适配请求参数的判断场景。如果你使用的版本更低,替换为trim($specificallerg) !== ''即可。- 该写法保持了查询链的完整性,不需要单独写if分支拼接查询条件,代码可读性更高。
内容的提问来源于stack exchange,提问作者cleocoder
相关产品推荐
相关产品推荐

