You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:11:08