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

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 ?? '';
}

额外建议

  1. 参数验证:在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());
    }
}
  1. 异常处理:如果业务要求必须找到对应邮箱才能插入记录,可以在getEmail方法中抛出异常,这样在store_alok的catch块中可以统一处理错误。

内容的提问来源于stack exchange,提问作者Dwi Nissa Ananda

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 16:57:06