我有三个表,一个是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.这意味着它仍处于待定状态。 所以我想只得到那些尚待处理的东西。没有交付。 这有点复杂,希望我能够正确解释我想要做什么。
答案 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();