Laravel Lucid whereHas 按数据透视表中的最新列

Posted

技术标签:

【中文标题】Laravel Lucid whereHas 按数据透视表中的最新列【英文标题】:Laravel Lucid whereHas by latest column in pivot table 【发布时间】:2018-03-06 16:51:47 【问题描述】:

我有 3 个表:Orders(id、name、surname、created_at 和 updated_at)、OrdersStatuses(order_id、order_status_name_id、created_at)和 OrderStautsNames(id 和 name): 我有订单模型,其方法如下:

protected $appends = ['actual_status'];

public function orderProducts()

    return $this->hasMany(OrderProduct::class);


public function statuses()

    return $this->belongsToMany(OrderStatusName::class, 'order_statuses')
        ->withPivot('created_at');


public function getActualStatusAttribute()

    return $this->statuses()->latest('set_at')->first();

我在搜索所有订单时遇到问题,其中最高状态 ID(此信息在数据透视表 OrderStatuses 中,我需要在 OrderStatusNames 中的此状态名称)就像 $statuses(这是一个带有状态的数组)。我开始这样做了:

    $orders = Order::query();
    $orders->whereHas('statuses', function($query) use ($statuses) 
                $query->whereIn('order_status_name_id', $statuses);
            );

但是它返回给我的订单不是最新的状态,但是这个查询搜索了我所有的状态...。我可以按最新状态执行此操作吗?我尝试使用 current_status 但我不知道如何到达那里。

【问题讨论】:

您在查询中使用的$statuses 是什么? $statuses = constant(Order::class . '::' . strtoupper($this->constraints[$key]));我确定这很好。 $statuses 是一个饱和数组,在 Order Model 中是 const 【参考方案1】:

将此关系添加到您的订单模型

public function lastStatus()

    return $this->hasOne(OrderStatusName::class)->select('OrderStautsNames.*', 'order_statuses.order_id', DB::raw('MAX(order_statuses.set_at) as lastOrder'))->join('order_statuses', 'order_statuses.order_status_name_id', '=', 'OrderStautsNames.id')

然后急于加载它

$orders = Order::whereHas('lastStatus', function ($query) use ($statuses) 
    $query->whereIn('OrderStautsNames.id', $statuses);
)->get();

【讨论】:

以上是关于Laravel Lucid whereHas 按数据透视表中的最新列的主要内容,如果未能解决你的问题,请参考以下文章

在 Laravel 5 中合并 'with' 和 'whereHas'

Laravel - whereHas 查询没有返回正确的记录

Laravel - 使用“whereHas”获取嵌套关系

Laravel 的 whereHas 表现不佳

Laravel:具有 whereHas 和多对多关系的全局范围

Laravel Eloquent multiple whereHas on relationship where column 'order' 高于前一个 whereHas