Laravel+Filament数据保存报错:SQLSTATE[HY000] 1366整数值错误
问题解决:SQLSTATE[HY000]: 1366 Incorrect integer value 错误
核心原因
你的category_id字段为整数类型,但当前传入的是字符串化的数组值(如'["2"]'),类型完全不匹配导致数据库抛出类型错误。另外,由于你使用category_item中间表,说明item与category是多对多关联,不能直接给category_id字段赋值,需用Laravel多对多关联方法处理。
解决步骤
1. 确认模型多对多关联定义
先确保Item和Category模型的关联正确:
// app/Models/Item.php public function categories() { return $this->belongsToMany(Category::class, 'category_item', 'item_id', 'category_id'); } // app/Models/Category.php public function items() { return $this->belongsToMany(Item::class, 'category_item', 'category_id', 'item_id'); }
2. 修正控制器的保存/更新逻辑
不要直接操作category_id字段,改用sync或attach方法处理关联:
// ItemController 中的 store 方法 public function store(Request $request) { $validated = $request->validate([ 'name' => 'required|string', // 其他字段验证规则... 'categories' => 'required|array', 'categories.*' => 'exists:categories,id' // 验证分类ID合法性 ]); $item = Item::collect($validated); $item->categories()->sync($validated['categories']); // 同步分类关联 return new ItemResource($item); } // ItemController 中的 update 方法 public function update(Request $request, Item $item) { $validated = $request->validate([ 'name' => 'sometimes|required|string', // 其他字段验证规则... 'categories' => 'sometimes|required|array', 'categories.*' => 'exists:categories,id' ]); $item->update($validated); if (isset($validated['categories'])) { $item->categories()->sync($validated['categories']); // 更新分类关联 } return new ItemResource($item); }
3. 调整前端传参格式
确保前端传递的categories是纯数组(如[2,3]),而非字符串化的数组(如'"["2"]"')。若使用Vue/React等框架,避免手动将数组转为JSON字符串后再传递。
4. 清理冗余字段
如果你的item表中存在category_id字段,直接删除该字段——多对多关联无需在主表存储关联ID,所有关联关系都存储在category_item中间表中,这是常见的设计误区。
验证
完成上述修改后重新测试:
- 前端传递
categories: [2]格式的数组参数 - 后端会自动在
category_item表中创建item_id与category_id的关联记录 - 类型不匹配的SQL错误将不再出现
内容的提问来源于stack exchange,提问作者Mohamed Humaam Athif
相关产品推荐
相关产品推荐

