按关系中的最新记录列排序

时间:2019-12-27 09:59:14

标签: laravel eloquent

我有两个表(模型)VehicleRegistration。车辆有很多注册,每个注册都有start_dateexpiry_date,我需要按expiry_date获取所有具有最后注册排序的车辆。 这是我的Vehicle模型零件:

/**
     * @return HasMany
     */
    public function registrations() :HasMany
    {
        return $this->hasMany(Registration::class);
    }

    /**
     * @return HasOne
     */
    public function activeRegistration() :HasOne
    {
        return $this->hasOne(Registration::class)->latest();
    }

我试图这样解决:

Vehicle::with('activeRegistration')->get()->sortBy('activeRegistration.expiry_date')->take(5) // I need only 5 records

但是这没有按照我的预期工作。这是我的刀片文件的一部分:

@foreach($registrationsVehicle as $vehicle)
    <tr>
        <td>{{ $vehicle->registration }}</td>
        <td>{{ $vehicle->vehicleBrand->name }}</td>
        <td>{{ $vehicle->model }}</td>
        <td>{{ optional($vehicle->activeRegistration)->start_date }}</td>
        <td>{{ optional($vehicle->activeRegistration)->expiry_date }}</td>
    </tr>
@endforeach

我得到了数据,但是顺序不正确。

3 个答案:

答案 0 :(得分:3)

您需要在latest方法中添加字段:

    public function activeRegistration() :HasOne
    {
        return $this->hasOne(Registration::class)->latest('expiry_date');
    }

如果您想使用with('registration'),则需要使用以下闭包:

$vehicles = Vehicle::with(['registration' => function($relation) {
    $relation->orderBy('expiry_date', 'DESC')->first();
}])->take(5)->get();

对于 Laravel 5.7及更高版本

如果要获得最后的注册,只需使用latest('expiry_date')

它将自动转换为order by expiry_date desc

$vehicles = Vehicle::with(['registration' => function($relation) {
    $relation->latest('expiry_date')->first();
}])->take(5)->get();

答案 1 :(得分:0)

获取所有内容,然后在集合中使用sortBy()函数

 Vehicle::with(['activeRegistration'])
        ->all()
        ->sortByDest(function ($vehicle) {
            return $vehicle->activeRegistration->expiry_date;
        });

答案 2 :(得分:0)

最后,我这样解决:

return Vehicle::join('registrations', 'vehicles.id','=','registrations.vehicle_id')
            ->has('activeRegistration')
            ->orderBy('registrations.expiry_date')
            ->limit(5)
            ->get();