我有两个表(模型)Vehicle
和Registration
。车辆有很多注册,每个注册都有start_date
和expiry_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
我得到了数据,但是顺序不正确。
答案 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();