繁体   English   中英

如何从Laravel中的关系表过滤数据

[英]How to filter data from relational table in laravel

我有三个表,一个是orders表,另一个是order_status表,另一个是status表。 order_status表的目的是保持跟踪订单的事件。 我的表具有以下列。

订单表

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

订单状态表有

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

我的模型就是这个Order模型

 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的记录,这意味着它仍处于待处理状态。 所以我只想得到那些仍在等待中的。未交付。 听起来有点复杂,希望我能正确解释我要做什么。 在此处输入图片说明

您的模型关系应更改为适当的多对多关系。 模式看起来正确,因此我将进行以下更改:

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

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

这将正确地在order_statusorder_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();

更新

尝试此操作以获取所有仍待处理的订单。

$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();

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

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

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

要么

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

暂无
暂无

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

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