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

Laravel Eloquent代码返回500错误排查及SQL转Eloquent求助

问题排查与Eloquent转换方案

一、500响应问题排查及修复

你的代码返回500的核心原因是直接将请求参数拼接进原生SQL片段,未做参数绑定,这会导致SQL语法错误(比如当id_fasilitas是字符串类型时缺少引号)或SQL注入风险,同时还有潜在的字段关联错误。

修复后的Query Builder代码(安全且避免语法错误)

public function getInfoPelunasan(Request $request)
{
    $id_fasilitas = $request->id_fasilitas;

    // 定义第一个子查询:AI/MD类型的总和
    $ktSubquery = DB::table('kredit_transaksi')
        ->selectRaw('sum(jumlah) as jumlah, id_fasilitas')
        ->whereIn('tipe', ['AI', 'MD'])
        ->where('id_fasilitas', $id_fasilitas)
        ->groupBy('id_fasilitas');

    // 定义第二个子查询:BMB/BMD类型的总和
    $kdSubquery = DB::table('kredit_transaksi')
        ->selectRaw('sum(jumlah) as jumlah, id_fasilitas')
        ->whereIn('tipe', ['BMB', 'BMD'])
        ->where('id_fasilitas', $id_fasilitas)
        ->groupBy('id_fasilitas');

    $tunggakan = DB::table('kredit_fasilitas')
        ->leftJoinSub($ktSubquery, 'kt', function ($join) {
            $join->on('kredit_fasilitas.id', '=', 'kt.id_fasilitas');
        })
        ->leftJoinSub($kdSubquery, 'kd', function ($join) {
            // 确认kredit_fasilitas表存在no_fasilitas字段,否则此处关联逻辑错误
            $join->on('kredit_fasilitas.no_fasilitas', '=', 'kd.id_fasilitas');
        })
        ->where('kredit_fasilitas.id', $id_fasilitas)
        ->get();

    return response()->json([
        "success" => true,
        "message" => "Info pelunasan retrieved successfully.",
        "data" => $tunggakan
    ]);
}

额外排查点

  • 检查kredit_fasilitas表是否存在no_fasilitas字段,第二个左关联的字段匹配是否正确,这也是可能导致SQL错误的原因。
  • 开启Laravel调试模式(.env中APP_DEBUG=true),可以直接看到具体的错误信息,快速定位问题。

二、指定SQL转换为Eloquent写法

首先确保你已经创建了对应的Eloquent模型:

  • KreditFasilitas模型对应kredit_fasilitas表
  • KreditTransaksi模型对应kredit_transaksi表

实现代码

// 在KreditFasilitas模型中添加关联或子查询逻辑(可选,用于复用)
public function scopeWithPelunasan($query, $idFasilitas)
{
    // 子查询1:AI/MD总和
    $ktSum = KreditTransaksi::selectRaw('sum(jumlah) as kt_jumlah')
        ->whereIn('tipe', ['AI', 'MD'])
        ->whereColumn('id_fasilitas', 'kredit_fasilitas.id');

    // 子查询2:BMB/BMD总和
    $kdSum = KreditTransaksi::selectRaw('sum(jumlah) as kd_jumlah')
        ->whereIn('tipe', ['BMB', 'BMD'])
        // 注意此处关联的是no_fasilitas,需确认字段存在
        ->whereColumn('id_fasilitas', 'kredit_fasilitas.no_fasilitas');

    return $query->addSelect([
        'kt_jumlah' => $ktSum,
        'kd_jumlah' => $kdSum
    ])->where('id', $idFasilitas);
}

// 在控制器中调用
public function getInfoPelunasan(Request $request)
{
    $id_fasilitas = $request->id_fasilitas;

    $tunggakan = KreditFasilitas::withPelunasan($id_fasilitas)->first();

    return response()->json([
        "success" => true,
        "message" => "Info pelunasan retrieved successfully.",
        "data" => $tunggakan
    ]);
}

说明

  • 使用whereColumn确保关联字段的正确性,避免硬编码拼接。
  • 通过模型的scope方法封装查询逻辑,提高代码复用性。
  • 如果需要保留原SQL中的左关联结构,也可以用leftJoinSub方法在Eloquent中实现,和Query Builder的修复方案逻辑一致。

内容的提问来源于stack exchange,提问作者Dena Achmad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 21:47:05