提问者:小点点

Laravel:按hasOne关系排序的分页查询


我有一个有很多联系人的客户模型。我想创建一个按最新联系人分页和排序的联系人视图/列表。

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)
        ]);

感谢您的支持!


共1个答案

匿名用户

我认为你应该像这样重写你的查询

 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)