Laravel 8 API编辑更新后无法返回最新数据问题求助
Laravel 8 API更新数据后无法返回最新内容排查
我在用Laravel 8为Flutter应用开发后端API时,遇到了一个问题:编辑/更新数据后,无论是更新接口本身,还是调用其他获取该数据的API,都返回旧的内容。已经尝试过清除缓存命令,但没有效果,无法理解JSON接口为何会出现严重的缓存问题,需要帮忙排查。
数据添加代码
$input = $request->all(); $validation = Validator::make($input, [ // 'image' => 'required|image|max:2048', 'user_id' => 'required', 'team_name' => 'required', 'description' => 'required', 'status' => 'required', 'members' => 'required' ]); if ($validation->fails()) { return response()->json([ 'success' => false, 'data' => '', 'message' => implode(',\n', $validation->errors()->all()), ]); exit(); } if (isset($request['team_name']) && !empty($request['members']) && !empty($request['description']) && !empty($request['status'])) { $team_url = strtolower(str_replace(' ', '_', $request['team_name'])); $check_record = TeamModel::where('team_name', $request['team_name'])->count(); if ($check_record > 0) { /* means already exists */ return response()->json([ 'success' => false, 'message' => 'Team name already exists', 'data' => [] ], 200); die(); } } // $name = $request->file('image')->getClientOriginalName(); $teamModel = new TeamModel(); // uploading image starts if ($request->hasFile('image')) { $fileName = 'teams-' . time() . '.' . $request->file('image')->getClientOriginalExtension(); $path = $request->file('image')->move('images', $fileName); $teamModel->image = 'images/' . $fileName; } // uploading image ends // $teamModel->image = 'images/'; $teamModel->team_name = $input['team_name']; $teamModel->team_url = Str::slug($request['team_name'], '_'); $teamModel->description = $input['description']; $teamModel->created_by = $input['user_id']; $teamModel->status = $input['status']; if ($teamModel->save()) { $members = array($input['user_id']); // $request['members']['owner'] = 1; if (!empty($request['members'])) { $members = array_merge($members, $input['members']); } //Add Member if (!empty($members)) { foreach ($members as $mem) { $isSelf = $input['user_id'] == $mem ? 1 : 0; // $owner = auth()->user()->id == $mem ? 1 : 0; $arrData = [ 'team_id' => $teamModel->id, 'user_id' => $mem, 'request_by' => $input['user_id'], 'is_accepted' => $isSelf, 'seen_status' => $isSelf, 'owner' => $isSelf ]; DB::table('team_members')->insert($arrData); } } // $teamModel->image = $base_url . $teamModel->image; if ($teamModel->image != null || !empty($teamModel->image)) $teamModel->image = $base_url . $teamModel->image; else $teamModel->image = ''; return response()->json([ 'success' => true, 'message' => 'Team created successfully', 'data' => $teamModel ], 200); } else { return response()->json([ 'success' => true, 'message' => 'Unable to create team! Please try again.', 'data' => $teamModel ], 200); }
数据更新代码
$id = $input['id']; if (!isset($input['members'])) { return response()->json([ 'success' => false, 'message' => 'Please select team members first!', 'data' => [] ], 200); } $input = $request->all(); $validation = Validator::make($input, [ // 'image' => 'required|image|max:2048', 'id' => 'required', 'user_id' => 'required', 'team_name' => 'required', 'description' => 'required', 'status' => 'required', 'members' => 'required' ]); if ($validation->fails()) { return response()->json([ 'success' => false, 'data' => '', 'message' => implode(',\n', $validation->errors()->all()), ]); exit(); } if (isset($request['team_name']) && !empty($request['members']) && !empty($request['description']) && !empty($request['status'])) { $team_url = strtolower(str_replace(' ', '_', $request['team_name'])); $check_record = TeamModel::where('team_name', $request['team_name'])->count(); if ($check_record > 1) { /* means already exists */ return response()->json([ 'success' => false, 'message' => 'Team name already exists', 'data' => [] ], 200); die(); } } $teamModel = TeamModel::find($id); $teamModel->team_name = $request['team_name']; $teamModel->description = $request['description']; $teamModel->team_url = Str::slug($request['team_name'], '_'); // uploading image starts if ($request->hasFile('image')) { if (file_exists($teamModel->image)) { unlink($teamModel->image); } $fileName = 'teams-' . time() . '.' . $request->file('image')->getClientOriginalExtension(); $path = $request->file('image')->move('images', $fileName); $teamModel->image = 'images/' . $fileName; } // uploading image ends $teamModel->status = $request['status']; if ($teamModel->save()) { //Add Member $members = $input['members']; if (!empty($members)) { foreach ($members as $mem) { $isSelf = $input['user_id'] == $mem ? 1 : 0; $arrData = [ 'team_id' => $teamModel->id, 'user_id' => $mem, 'request_by' => $input['user_id'], 'is_accepted' => $isSelf, 'seen_status' => $isSelf ]; if (!team_member($teamModel->id, $mem)) DB::table('team_members')->insert($arrData); } } if ($teamModel->image != null || !empty($teamModel->image)) $teamModel->image = $base_url . $teamModel->image; else $teamModel->image = ''; return response()->json([ 'success' => true, 'message' => 'Team updated successfully', 'data' => $teamModel ], 200); } else { return response()->json([ 'success' => false, 'message' => 'Unable to update team! please try again.', 'data' => [] ], 200); }
响应返回格式
return response()->json([ 'success' => true, 'message' => 'Success message', 'data' => $data ], 200);
排查方向及解决办法
- 刷新模型实例:更新操作完成后,当前的
$teamModel是从数据库加载的旧实例,虽然save()已写入数据库,但实例属性可能未同步。在save()后调用$teamModel->refresh(),重新从数据库拉取最新数据再返回:if ($teamModel->save()) { $teamModel->refresh(); // 新增这行 // 后续成员处理、图片路径拼接逻辑... } - 检查查询缓存:确认获取数据的接口是否使用了
remember()、cache()等缓存逻辑,或者第三方缓存包。如果有,移除缓存逻辑,或者在更新数据后主动清除对应缓存。 - HTTP缓存校验:
- 检查Laravel路由是否添加了缓存中间件(如
cache.headers),若有则移除或调整缓存策略,确保API请求不被缓存。 - 确认Flutter客户端的HTTP请求头设置,添加
Cache-Control: no-cache或max-age=0,避免客户端缓存旧响应。
- 检查Laravel路由是否添加了缓存中间件(如
- 修正重复数据校验逻辑:更新代码中团队名重复校验的逻辑存在错误,当前
$check_record > 1无法正确判断重名(比如其他团队已使用该名称时,count为1不会触发错误),应修改为:$check_record = TeamModel::where('team_name', $request['team_name']) ->where('id', '!=', $id) // 排除当前更新的团队 ->count(); if ($check_record > 0) { // 返回团队名已存在的错误响应 } - 彻底清除Laravel缓存:执行以下命令确保所有缓存都被清除:
php artisan cache:clear php artisan config:clear php artisan route:clear php artisan view:clear
内容的提问来源于stack exchange,提问作者MdFarzan
相关产品推荐
相关产品推荐

