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
相关产品推荐
相关产品推荐

