我有一个有很多联系人的客户模型。我想创建一个按最新联系人分页和排序的联系人视图/列表。
Customer.php
public function contacts()
{
return $this->hasMany(Contact::class);
}
public function latestContact()
{
return $this->hasOne(Contact::class)->latestOfMany()->withDefault();
}
在视图中,我想这样向客户展示:
@foreach ($customers as $customer)
<x-table.row wire:key="row-{{ $customer->id }}">
<x-table.cell>
{{ $customer->last_name }}, {{ $customer->first_name }}
</x-table.cell>
<x-table.cell>
{{ $customer->latestContact->contacted_at }}
</x-table.cell>
</x-table.row>
@endforeach
表结构
Schema::create('customers', function (Blueprint $table) {
$table->id();
$table->foreignId('user_id');
$table->string('first_name');
$table->string('last_name');
});
Schema::create('contacts', function (Blueprint $table) {
$table->id();
$table->foreignId('user_id');
$table->foreignId('customer_id');
$table->string('type');
$table->string('body');
$table->timestamp('contacted_at');
});
我正在努力找到正确的查询。这是我最后一次尝试,它给了我以下错误:
Illumb\Database\QueryException SQLSTATE[42S22]:未找到列:1054未知列的最新联系人。在“订单条款”中联系您。。。
return view('livewire.dashboard', [
'customers' => Customer::with('customers.*', 'latestContact.contacted_at')
->join('contacts', 'contacts.customer_id', '=', 'customers.id')
->orderBy('latestContact.contacted_at')
->paginate(25)
]);
感谢您的支持!
我认为你应该像这样重写你的查询
Customer::with(['contacts', 'latestContact'])
->orderBy('latestContact.contacted_at')
->paginate(25)
最新答案
$customers= Customer::with(['contacts', 'latestContact'=>function($query){
return $query->orderBy('contacted_at','DESC');
}])->paginate(25);
在客户模型中,您需要修改如下关系
public function latestContact()
{
return $this->hasOne(Contact::class)->withDefault();
}
latestOfMany表示该关系是较大的一对多关系的最新单一结果。
latestOfMany($column = 'id', $relation = null)