如何在laravel中过滤关系表中的数据

de90aj5v  于 2021-06-24  发布在  Mysql
关注(0)|答案(2)|浏览(330)

我有三张table一张是 orders 一张table和另一张table order_status 一张table和另一张table status table。目的 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意味着它是挂起的,然后后期得到了交付。或者你可以说得到了处理。其中as e02eaa4be只有一条状态1的记录。也就是说它还在等待。所以,我只想得到那些仍然悬而未决。没有交付。这听起来有点复杂,希望我能正确地解释我在做什么。

2cmtqfgy

2cmtqfgy1#

更新
尝试此操作以获取所有仍在等待的订单。。

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

如果有两个状态记录与一个订单相关,且其中一个状态值为1,则此查询将返回订单记录。您可以用您的确切条件更新它。(如果您确定只有两个状态与一个订单相关,而该订单仍处于挂起状态,那么您可以删除第二个状态。) 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();
hfyxw5xn

hfyxw5xn2#

你的模型关系应该改成适当的多对多关系。架构看起来是正确的,因此我将进行以下更改:

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

相关问题