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

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参数,可以在自定义请求类中统一将其转为数组,避免重复处理:

  1. 生成并编辑请求类(如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;
    }
}
  1. 在控制器中使用该请求类,此时$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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 16:25:35