代码之家  ›  专栏  ›  技术社区  ›  user7747472

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

  •  1
  • user7747472  · 技术社区  · 7 年前

    我有三张桌子一张是 orders 表和另一个是 order_status 表和另一个是 status 桌子目的: order\u状态 表是用来保持跟踪顺序的事件。我的表格有以下列。

    订单表

    ----------------------------
    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记录。这意味着它仍然悬而未决。 因此,我只想得到那些仍然悬而未决的。未交付。 这听起来有点复杂,希望我能正确地解释我在做什么。 enter image description here

    2 回复  |  直到 7 年前
        1
  •  2
  •   Brian Lee    7 年前

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

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

        2
  •  0
  •   iamab.in    7 年前

    使现代化

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

    $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 关系如@DigitalDriver建议的。我还建议你 多对多 关系

    如果您正在使用 多对多 然后您可以尝试以下查询。。

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

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