Laravel POST请求查询数据存入alokasikegiatan表遇报错求助
问题解决:Trying to get property 'email' of non-object
错误原因
你遇到的错误是因为当DB::table(...)->where(...)->first()没有找到匹配记录时,会返回null,此时直接访问->email就会触发“获取非对象的属性”错误。另外你的count($row_peg)逻辑也存在问题——$row_peg已经是尝试获取的email属性值(如果查询成功),如果查询失败这里已经报错,根本走不到判断逻辑。
修正后的代码方案
方案1:安全查询+分步判断
先分别获取两个表的查询结果,确认存在后再取email,避免直接访问null的属性:
public function getEmail($request) { // 先从users表查询 $user = DB::table('users')->where('nip', $request->id_anggota)->first(); if ($user) { return $user->email; } // users表没找到,再查registeredmitra表 $mitra = DB::table('registeredmitra')->where('sobatid', $request->id_anggota)->first(); if ($mitra) { return $mitra->email; } // 两个表都没找到的情况,返回默认值或抛出异常(根据业务需求调整) return ''; // 或者如果需要强制存在,抛出异常: // throw new \Exception("未找到对应id_anggota的邮箱记录"); }
方案2:使用value()方法简化代码
Laravel的查询构造器提供了value()方法,会直接返回指定字段的值,没有匹配记录时返回null,可以进一步简化逻辑:
public function getEmail($request) { $email = DB::table('users')->where('nip', $request->id_anggota)->value('email'); if (!$email) { $email = DB::table('registeredmitra')->where('sobatid', $request->id_anggota)->value('email'); } // 处理无匹配的情况 return $email ?? ''; }
方案3:使用Eloquent模型(推荐,更符合Laravel风格)
如果你的users和registeredmitra表有对应的Eloquent模型(比如User和RegisteredMitra),可以这样写:
// 假设存在User模型和RegisteredMitra模型 public function getEmail($request) { $user = User::where('nip', $request->id_anggota)->first(); if ($user) { return $user->email; } $mitra = RegisteredMitra::where('sobatid', $request->id_anggota)->first(); return $mitra?->email ?? ''; }
额外建议
- 参数验证:在
store_alok方法开头添加请求参数验证,确保id_anggota和id_keg是必填的,避免空值查询:
public function store_alok(Request $request) { $request->validate([ 'id_anggota' => 'required', 'id_keg' => 'required', ]); try { AlokasiKegiatan::insert([ 'id_keg' => $request->id_keg, 'email' => $this->getEmail($request), ]); } catch (\Exception $e) { throw new \Exception($e->getMessage()); } }
- 异常处理:如果业务要求必须找到对应邮箱才能插入记录,可以在
getEmail方法中抛出异常,这样在store_alok的catch块中可以统一处理错误。
内容的提问来源于stack exchange,提问作者Dwi Nissa Ananda
相关产品推荐
相关产品推荐

