简体   繁体   English

Laravel Lucid其中有数据透视表中的最新列

[英]Laravel Lucid whereHas by latest column in pivot table

I have 3 tables : Orders ( id, name, surname, created_at and updated_at ), OrdersStatuses (order_id, order_status_name_id, created_at) and OrderStautsNames ( id and name ): I have orders model which has method like this: 我有3个表:订单(id,名称,姓氏,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();
}

I have problem with seraching all orders, where highest status id ( this info is in pivot table OrderStatuses, and I need name of this status which is in OrderStatusNames ) is like $statuses (this is an array with statuses ). 我在搜索所有订单时遇到问题,其中最高状态ID(此信息位于数据透视表OrderStatuses中,并且我需要此状态的名称位于OrderStatusNames中)就像$ statuses(这是一个具有statuss的数组)一样。 I started do like this: 我开始这样做:

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

But it return me orders with not latest status, but this query search me throught all statuses... . 但是它返回的不是最新状态的订单,而是此查询在所有状态下搜索我...。 Can i do this by latest status? 我可以按最新状态执行此操作吗? I tryed to use current_status but I don't know how to get there. 我尝试使用current_status,但不知道如何到达那里。

Add this relation to your Order Model 将此关系添加到您的订单模型中

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')
}

Then eager load it 然后渴望加载

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM