如何在laravel

时间:2018-04-24 07:11:01

标签: php mysql laravel laravel-5 eloquent

我有三个表,一个是orders表,另一个是order_status表,另一个是status表。 order_status表的目的是保留跟踪订单的事件。我的表格如下:

订单表

----------------------------
id | ref_num | name | email |
-----------------------------

订单状态表有

---------------------------
order_id | status_id
---------------------

我的模特是这样的 订单型号

 public function orderStatus(){
        return $this->hasMany(OrderStatus::class');
    }

订单状态模式

  public function detail(){
        return $this->belongsTo(Status::class,'status_id','id');
    }

    public function order(){
        return $this->belongsTo(Order::class);
    }

现在我希望得到所有尚待处理的订单。 我怎么能这样做?

我试图像这样反击,但它失败了

 $data['orders']= Order::with(['orderStatus' =>function($q){
                $q->with('detail')->latest()->where('status_id',2);
            }])->latest()->take(10)->get()->toArray();

这只返回一个之后它没有。

任何人都可以告诉我如何才能对此进行排序? 谢谢

PS ::一个订单可以有多个状态,例如未付款,待处理,打包,在途等等,但按顺序列出

我添加了订单状态表图片。你可以看到 E7E7FF0EB7 订单号有两个记录1,而2表示它正在等待,然后后期阶段得到了交付。或者你可以说已经处理完了。其中E02EAEA4BE只有一个状态记录1.这意味着它仍处于待定状态。 所以我想只得到那些尚待处理的东西。没有交付。 这有点复杂,希望我能够正确解释我想要做什么。 enter image description here

2 个答案:

答案 0 :(得分:2)

您的模型关系应该更改为适当的多对多。模式看起来正确,所以我做了以下更改:

// Order model
public function statuses(){ 
    return $this->belongsToMany(Status::class); 
}

// Status model
public function orders(){ 
    return $this->belongsToMany(Order::class); 
}

这将在order_status上正确转动。

要获得挂单,查询将是:

Order::whereHas('statuses', function ($query) {
    // assuming a 'name' column on statuses table
    $query->where('name', 'pending');
    // or using dynamic where
    // $query->whereName('pending');
})->get();

或者,将范围添加到订单模型:

public function scopePending($query) {
    return $query->with(['statuses' => function ($query) {
        $query->where('name', 'pending');
    });
});

可以使用:Order::pending();

答案 1 :(得分:0)

<强>更新

尝试此操作以获取尚未处理的所有订单..

$data['orders'] =  Order::has('orderStatus', '=', 2)->whereHas('orderStatus', function ($q) {
            $q->where('status_id', 2);
        })->get()->toArray();

如果有两个状态记录与一个订单相关且其中一个状态值为1,则此查询将返回订单记录。您可以根据具体情况对其进行更新。(如果您确定只有2个状态与尚未处理的订单相关,那么您可以删除第二个whereHas

$data['orders'] =  Order::has('orderStatus', '=', 2)->get()->toArray();

您可以使用many to many关系作为@DigitalDrifter建议。我还建议您遵循many to many关系

如果您使用many to many关系,则可以尝试以下查询..

Order::has('statuses', '=', 2)->WhereHas('statuses', function ($query) {
    $query->where('name', 'pending');
})->get();

Order::has('statuses', '=', 2)->get();