简体   繁体   中英

How to filter data from relational table in laravel

I have three table one is orders table and another is order_status table and another is status table. Purpose of order_status table is to keep a track order's events. My table has the following column.

Order table

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

Order status table has

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

My models are like this Order model

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

Order status model

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

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

Now i want to get all those order which are still pending. How can i do so ?

I tried to retrive like this but it failed

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

This return only one after that it does not.

Can anyone please tell me how can i sort this one ?? Thanks

PS:: one order can have multiple status such as unpaid, pending, packageging, in transit and so on but in sequence ofcouse

I added order status table image.. As u can see E7E7FF0EB7 order number has two records 1,and 2 means it was pending and then later stage got delivered.or you can say got processed. where as E02EAEA4BE has only one record of status 1. which means it is still pending. So i want to get only those which are still pending.Not delivered. This kinda sound complicated, hope i able to explain properly what i am trying to do. 在此处输入图片说明

Your model relations should be changed to a proper many to many. The schemas look correct so I'd make the following changes:

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

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

This will pivot correctly on order_status .

To get pending orders the query would be:

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

Alternatively, add a scope to Order model:

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

Usable then as: Order::pending();

Update

Try this to get all those order which are still pending..

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

If there is two status records related to one order and one of the status value is 1 then this query will return the order record. You may update it with your exact conditions.(If you are sure that there will be only 2 status related to a order which is still pending then you may remove the second whereHas .

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

You may use the many to many relation as @DigitalDrifter suggested. I would also suggest that you should follow many to many relation .

If you are using the many to many relation then you may try the below query..

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

or

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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