Laravel更新数据时whereNotIn传入null触发类型错误求助
解决Laravel中whereNotIn参数为null导致的类型错误
问题原因
报错Illuminate\Database\Query\Builder::cleanBindings(): Argument #1 ($bindings) must be of type array, null given的核心原因是:whereNotIn方法要求第二个参数必须是数组类型,但当用户未选择任何标签时,$request->userTag返回null,不符合方法的参数类型要求,进而触发绑定参数清理时的类型错误。
你的业务逻辑是保留用户选中的标签、删除未选中的标签,当用户未选标签时,需要删除所有关联标签。
解决方案
方案1:直接判断参数并分支处理
先将$request->userTag转换为数组(null时转为空数组),再根据数组是否为空执行不同逻辑:
// 处理参数,null转为空数组 $userTags = $request->userTag ?? []; if (empty($userTags)) { // 未选任何标签,删除所有关联标签 $tradeSetup->tags()->delete(); } else { // 删除不在选中列表中的标签 $tradeSetup->tags()->whereNotIn('user_tag_id', $userTags)->delete(); }
方案2:使用Laravel查询构建器的when方法简化代码
利用when方法实现条件分支,代码更简洁:
$userTags = $request->userTag ?? []; $tradeSetup->tags() ->when(!empty($userTags), function ($query) use ($userTags) { // 仅当有选中标签时,添加whereNotIn条件 return $query->whereNotIn('user_tag_id', $userTags); }) ->delete();
方案3:在请求类中统一处理参数(推荐)
如果多个地方需要用到userTag参数,可以在自定义请求类中统一将其转为数组,避免重复处理:
- 生成并编辑请求类(如
UpdateTradeSetupRequest):
namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class UpdateTradeSetupRequest extends FormRequest { public function rules() { return [ // 其他字段验证规则 'userTag' => 'nullable|array', ]; } public function validated() { $validated = parent::validated(); // 将null转为空数组 $validated['userTag'] = $validated['userTag'] ?? []; return $validated; } }
- 在控制器中使用该请求类,此时
$request->userTag永远是数组:
public function update(UpdateTradeSetupRequest $request, TradeSetup $tradeSetup) { $userTags = $request->validated()['userTag']; if (empty($userTags)) { $tradeSetup->tags()->delete(); } else { $tradeSetup->tags()->whereNotIn('user_tag_id', $userTags)->delete(); } // 其他更新逻辑 }
内容的提问来源于stack exchange,提问作者harith
相关产品推荐
相关产品推荐

