首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从关系中按最新记录列排序

从关系中按最新记录列排序
EN

Stack Overflow用户
提问于 2019-12-27 09:59:14
回答 3查看 109关注 0票数 0

我有两个表(模型) VehicleRegistration。车辆有很多登记,每一次登记都有start_dateexpiry_date,我需要得到所有车辆的最后一次登记按expiry_date排序。这是我的Vehicle模型部分:

代码语言:javascript
运行
复制
/**
     * @return HasMany
     */
    public function registrations() :HasMany
    {
        return $this->hasMany(Registration::class);
    }

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

我试着像这样解决:

代码语言:javascript
运行
复制
Vehicle::with('activeRegistration')->get()->sortBy('activeRegistration.expiry_date')->take(5) // I need only 5 records

但这不像我预料的那样有效。这是我的刀片文件的一部分:

代码语言:javascript
运行
复制
@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

我得到了数据,但顺序不对。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-12-27 18:22:34

最后,我像这样解决:

代码语言:javascript
运行
复制
return Vehicle::join('registrations', 'vehicles.id','=','registrations.vehicle_id')
            ->has('activeRegistration')
            ->orderBy('registrations.expiry_date')
            ->limit(5)
            ->get();
票数 0
EN

Stack Overflow用户

发布于 2019-12-27 10:06:09

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

代码语言:javascript
运行
复制
    public function activeRegistration() :HasOne
    {
        return $this->hasOne(Registration::class)->latest('expiry_date');
    }

如果您想使用with('registration'),您需要像这样使用闭包:

代码语言:javascript
运行
复制
$vehicles = Vehicle::with(['registration' => function($relation) {
    $relation->orderBy('expiry_date', 'DESC')->first();
}])->take(5)->get();

Laravel5.7及以后的

如果你想获得最后一次注册,你可以直接使用latest('expiry_date')

它将自动转换为order by expiry_date desc

代码语言:javascript
运行
复制
$vehicles = Vehicle::with(['registration' => function($relation) {
    $relation->latest('expiry_date')->first();
}])->take(5)->get();
票数 3
EN

Stack Overflow用户

发布于 2019-12-27 10:51:13

然后在集合中使用sortBy()函数

代码语言:javascript
运行
复制
 Vehicle::with(['activeRegistration'])
        ->all()
        ->sortByDest(function ($vehicle) {
            return $vehicle->activeRegistration->expiry_date;
        });
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59498962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档