如何从Javascript向Laravel传递数组?出勤提交报错求助
解决 "Trying to get property 'stdId' of non-object" 错误
首先看你的错误信息,问题出在控制器里把整个数组当成单个对象来访问属性了!从你dd($data)的输出能看到,$data是一个包含多个学生出勤记录的数组,而不是单个对象。你直接写$data->stdId,相当于要从数组本身获取stdId属性,这显然行不通——数组没有这个属性,所以报错。
修复控制器代码
你需要遍历这个数组,逐个处理每个学生的出勤记录:
class RollCallController extends Controller { public function rollCallSave(Request $request) { // 解析前端传来的数组,第二个参数true转成关联数组,处理更直观 $data = json_decode($request->input('data'), true); // 遍历每条出勤记录 foreach ($data as $record) { // 简单验证,避免空数据存入 if(empty($record['stdId']) || empty($record['rollCall'])) { continue; // 也可以返回错误提示给前端 } $rollCall = new RollCall(); $rollCall->stdId = $record['stdId']; $rollCall->rollCall = $record['rollCall']; $rollCall->save(); } return response()->json(['data' => $data, 'message' => 'Roll-Call Successfully taken!']); } }
额外优化:简化前端AJAX逻辑
你前端用JSON.stringify(data)把数组转成字符串,后端再解码其实没必要。Laravel支持直接接收数组格式的POST数据,你可以修改前端AJAX的data部分:
$.ajax({ type:'POST', url: '/rollCall', beforeSend: function (xhr, type) { if(!type.crossDomain) { xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content')); } }, // 直接传数组,无需JSON.stringify data: { 'data': data }, success:function(response){ if(response) { M.toast({html:'Roll-Call Successfully taken!'}); } else { M.toast({html:'Not Success'}); } console.log(response); }, error:function(xhr, status, error){ M.toast({html:"Pls Make sure to check each student"}); } });
对应的后端可以直接获取数组,省去json_decode步骤:
// Laravel会自动解析POST过来的数组 $data = $request->input('data');
补充说明原代码的问题
你原控制器里试图把整个数组赋值给单个RollCall模型的属性,逻辑完全错误——你有多个学生的记录,需要创建多条数据库记录,而不是把所有数据塞进一条记录里。另外$rollCall->save((array)$data);这行是多余的,save()方法不需要传参数,给模型属性赋值后直接调用save()即可。
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

