Laravel执行attach关联前如何校验categories_ids中的ID是否存在于数据库
分类ID存在性校验实现方案
你可以通过批量查询+差集计算的方式识别无效分类ID,修改后的完整代码如下:
public static function setArticleCategory(Request $request) { // 基础参数校验,可根据业务调整规则 $validated = $request->validate([ 'article_id' => 'required|integer', 'categories_ids' => 'required|json' ]); $article = Article::where('id', $request->article_id)->first(); if(!$article){ return response()->json([ 'message' => 'Article not found' ], 404); } $categories_ids = json_decode($request->categories_ids, true); // 加第二个参数true返回数组,方便后续处理 // 校验解析后是否为非空整数数组 if (!is_array($categories_ids) || empty($categories_ids) || count(array_filter($categories_ids, 'is_int')) !== count($categories_ids)) { return response()->json([ 'message' => '分类ID参数格式错误,需为非空整数数组' ], 400); } // 批量查询数据库中存在的分类ID,可根据自己项目的分类模型命名空间调整 $existsCategoryIds = \App\Models\Category::whereIn('id', $categories_ids)->pluck('id')->toArray(); // 计算不存在的无效ID $invalidIds = array_diff($categories_ids, $existsCategoryIds); // 存在无效ID直接返回错误 if (!empty($invalidIds)) { return response()->json([ 'message' => '存在无效分类ID', 'invalid_ids' => array_values($invalidIds) ], 400); } $article->categories()->attach($categories_ids); return response()->json([ 'message' => $categories_ids ], 200); }
实现逻辑说明
- 首先通过
json_decode第二个参数设置为true,确保解析结果为数组格式,方便后续校验 - 新增了基础参数校验规则,避免传入非法格式的参数
- 用
whereIn批量查询分类表,一次查询即可拿到所有存在的ID,避免循环查询产生N+1性能问题 - 通过
array_diff计算传入ID和存在ID的差集,直接得到所有无效ID,可直接返回给前端做提示
内容的提问来源于stack exchange,提问作者user16978178
相关产品推荐
相关产品推荐

