Lumen PUT请求无法正确更新MySQL数据,字段被置空
解决Lumen PUT请求无法获取JSON参数导致更新为空的问题
嘿,我一眼就看出问题所在了——你的Lumen应用根本没正确解析Postman发送的JSON请求体,所以$request->all()才返回空数组,最终更新时把数据库字段都置成空值了。下面是具体的排查和解决步骤,一步步来:
1. 启用Lumen的JSON解析中间件
Lumen 5.5默认不会自动启用处理JSON请求的核心中间件,你得手动打开bootstrap/app.php文件,把下面这行中间件的注释去掉:
$app->middleware([ // 取消这行的注释,确保它能生效 \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class, ]);
这个中间件负责把JSON请求体转换成框架能识别的参数集合,没有它的话,哪怕你Content-Type头设置对了,Lumen也读不到请求里的参数。
2. 检查Postman里的JSON格式是否合规
JSON格式的语法错误也会导致解析失败,你可以对照这几点自查:
- 所有键名必须用双引号(比如
"elderly_id": 1是正确的,'elderly_id':1就会报错) - 最后一个键值对后面别加多余的逗号
- 如果字段是整数类型,数值不要加引号(比如
"centre_id": 123,不是"centre_id": "123")
3. 改用$request->json()直接获取JSON参数(备选方案)
要是启用中间件后还是没解决,你可以绕过input()方法,直接从JSON请求体里读取参数,修改控制器代码如下:
public function updateSensorPackage(Request $request, $id){ $sensorPackage = AddSensorPackage:: find($id); // 用json()方法直接读取JSON请求体中的字段 $sensorPackage->elderly_id = $request->json('elderly_id'); $sensorPackage->centre_id = $request->json('centre_id'); $sensorPackage->package_id = $request->json('package_id'); $sensorPackage->beacon_id = $request->json('beacon_id'); $sensorPackage->created_by = $request->json('created_by'); $sensorPackage->save(); return response('Updated Successfully', 200); }
4. 确认路由配置无误
别忽略基础检查——你的PUT路由是不是正确指向了这个控制器方法?比如在routes/web.php里应该是这样的:
$router->put('/sensor-packages/{id}', 'YourControllerName@updateSensorPackage');
确保HTTP方法是PUT,和你Postman发送的请求方法完全一致。
5. 额外优化:给模型添加$fillable属性
虽然这不是当前问题的直接原因,但为了后续代码更简洁,建议你在AddSensorPackage模型里设置可批量赋值的字段:
class AddSensorPackage extends Model { protected $fillable = ['elderly_id', 'centre_id', 'package_id', 'beacon_id', 'created_by']; }
等你能正确获取参数后,就可以用$sensorPackage->update($request->all());来批量更新,不用一个个字段手动赋值了。
内容的提问来源于stack exchange,提问作者0xMinCha
相关产品推荐
相关产品推荐

