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

Laravel 10:如何获取每个Customer的最新Penawaran更新时间

问题分析与修复方案

你的问题核心出在模型关联关系错误,以及未正确获取客户最新Penawaran的更新时间,以下是分步修正方案:

1. 修正模型关联关系

根据业务规则(一个客户可创建多条报价,一条报价仅归属一个客户),正确的关联定义如下:

models/Customer.php

public function penawarans()
{
    // 客户拥有多条报价,外键为penawarans表的customer_id
    return $this->hasMany(Penawaran::class, 'customer_id');
}

models/Penawaran.php

public function customer()
{
    // 报价属于一个客户,外键为当前表的customer_id
    return $this->belongsTo(Customer::class, 'customer_id');
}

注:关联方法名用复数penawarans更符合语义,后续调用逻辑更清晰。

2. 优化控制器查询,获取最新报价的更新时间

要高效获取每个客户最新一条Penawaran的updated_at,推荐使用Laravel的withMax聚合查询:

PenawaranController.php

public function index()
{
    $data = Customer::orderBy('nama', 'ASC')
        // 直接聚合获取每个客户最新报价的更新时间,别名latest_penawaran_at
        ->withMax('penawarans', 'updated_at')
        ->get();

    $view_data = [
        'page_title' => 'List Customer',
        'active' => 'customer',
        'data' => $data,
    ];

    return view('customer.index', $view_data);
}

如果偏好关联查询取最新一条,可修改with闭包:

$data = Customer::orderBy('nama', 'ASC')
    ->with(['penawarans' => function ($query) {
        $query->orderBy('updated_at', 'desc')->take(1);
    }])
    ->get();

3. 修正视图字段调用

视图需输出最新报价的更新时间,而非客户自身的updated_at:

若使用withMax方案:

@foreach ($data as $row)
    <tr>
        <td class="px-2 fit">{{ $loop->index + 1 }}.</td>
        <td>{{ $row->nama }}</td>
        <td class="fit">{{ $row->telepon }}</td>
        <td class="fit">
            {{ $row->penawarans_max_updated_at 
                ? date('d F Y H:i:s', strtotime($row->penawarans_max_updated_at)) 
                : '无报价记录' 
            }}
        </td>
    </tr>
@endforeach

若使用关联取第一条方案:

@foreach ($data as $row)
    <tr>
        <td class="px-2 fit">{{ $loop->index + 1 }}.</td>
        <td>{{ $row->nama }}</td>
        <td class="fit">{{ $row->telepon }}</td>
        <td class="fit">
            {{ $row->penawarans->first() 
                ? date('d F Y H:i:s', strtotime($row->penawarans->first()->updated_at)) 
                : '无报价记录' 
            }}
        </td>
    </tr>
@endforeach

关键错误总结

  • 模型关联逻辑颠倒:将hasMany与belongsTo搞混,导致关联数据无法正确加载
  • 视图错误调用了客户表的updated_at,而非目标报价表的字段
  • 初始查询未针对性获取最新报价记录,而是加载了所有关联数据

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 04:10:25