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 Eloquent multiple whereHas on relationship where column 'order' 高于前一个 whereHas