You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Eloquent的pluck()方法支持用户空输入正常通过查询?

过敏原筛选空输入问题修复方案

问题根源

  • 原有代码存在两处错误:
    1. 闭包内的LIKE条件硬编码为%specificallerg%,没有实际传入用户输入的过敏原变量,空输入时%%会匹配所有食材条目,whereDoesntHave逻辑会排除所有关联了食材的食谱,最终返回空数组。
    2. 没有做过敏原输入非空判断,空输入时也执行了无意义的排除逻辑。

无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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 14:45:00