【问题标题】:How to filter data from relational table in laravel如何在laravel中过滤关系表中的数据
【发布时间】:2018-10-04 08:19:53
【问题描述】:

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

【问题讨论】:

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

标签: php mysql laravel laravel-5 eloquent


【解决方案1】:

更新

试试这个来获取所有那些仍然未决的订单..

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

【讨论】:

  • 但这将给出所有订单状态为 2 的订单,如果某个订单的订单状态为 2,3,4,那么该订单也会来。我不希望这种情况发生,我只希望那些状态为 1,2 的人会来
  • @user7747472 你试过了吗?有帮助吗?或者有什么问题?
  • @ab_ab ,嗨,ab 它出于某种原因返回空对象,尽管我在订单状态表中重新记录了 3 次
  • 我的错,我在枢轴连接中犯了一些错误。我正在获取数据。但它也显示了那些已交付的
  • 您能否确认该查询返回的已发货订单在数据透视表中只有两条记录?
【解决方案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();

或者,向 Order 模型添加范围:

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

然后用作:Order::pending();

【讨论】:

  • 我喜欢这个查询构建,但它是我的空对象。顺便说一句,我想问的另一件事。由于我的订单状态表包含订单的所有事件,即如果订单已交付,它还会在订购时保存其记录,包装时,发货时间和交付时间。在这种情况下,是否可以仅过滤那些尚未处理到运输等仍处于待处理阶段的数据??
  • 糟糕的是,这是显示数据,但它也显示了所有已交付的数据
猜你喜欢
  • 2017-08-11
  • 2022-01-19
  • 2021-08-07
  • 1970-01-01
  • 2019-07-24
  • 2015-01-29
  • 2021-03-09
  • 2015-05-17
  • 2020-12-17
相关资源
最近更新 更多