单次请求批量操作数据库记录时出现Trying to get property 'item' of non-object错误的求助
问题排查与解决方案
错误原因分析
你遇到的「Trying to get property 'item' of non-object」错误,是两个核心问题叠加导致的:
- 请求结构与代码逻辑不匹配:你的Postman发送的是单个包含
subject_quiz_id和item数组的JSON对象,但控制器里却把它当成「对象数组」做外层foreach遍历——这会让你遍历到的第一个$key是字符串"7"(也就是subject_quiz_id的值),字符串不是对象,自然没法访问->item属性。 - 数组/对象访问语法混用:即便拿到正确的
item数据,你用了对象访问符->去访问数组元素,PHP也会抛出异常,因为POST解析后的请求数据是关联数组,不是对象。
修正后的控制器代码
直接去掉多余的外层foreach,改用数组语法访问请求数据即可:
// 假设在Laravel环境中,先获取所有请求数据 $data = $request->all(); // 提取公共的subject_quiz_id $subject_quiz_id = $data['subject_quiz_id']; // 遍历item数组处理每条记录 foreach ($data['item'] as $attribute) { if ($attribute['action'] == 'store') { $insert_array = [ 'subject_quiz_id' => $subject_quiz_id, 'registration_record_id' => $attribute['registration_record_id'], 'mark' => $attribute['mark'] ]; // 记得执行实际的插入操作,比如: // YourScoreModel::create($insert_array); } }
额外扩展场景
如果你确实需要批量处理多个测验的成绩(一次提交多个subject_quiz_id对应的记录),可以把Postman参数改成数组格式:
[ { "subject_quiz_id": "7", "item": [{ "action": "store", "registration_record_id": "7", "mark": "3" }] }, { "subject_quiz_id": "8", "item": [{ "action": "store", "registration_record_id": "9", "mark": "5" }] } ]
此时控制器的外层foreach才合理,但仍要使用数组语法:
foreach ($data as $key) { foreach ($key['item'] as $attribute) { if ($attribute['action'] == 'store') { $insert_array = [ 'subject_quiz_id' => $key['subject_quiz_id'], 'registration_record_id' => $attribute['registration_record_id'], 'mark' => $attribute['mark'] ]; // 执行插入操作 } } }
内容的提问来源于stack exchange,提问作者Mouhammad Talaa
相关产品推荐
相关产品推荐

