Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/250.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在laravel中过滤关系表中的数据_Php_Mysql_Laravel_Laravel 5_Eloquent - Fatal编程技术网

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

Php 如何在laravel中过滤关系表中的数据,php,mysql,laravel,laravel-5,eloquent,Php,Mysql,Laravel,Laravel 5,Eloquent,我有三个表一个是订单表,另一个是订单状态表,另一个是状态表。order\u status表的目的是跟踪订单的事件。我的表有以下列 订单表 ---------------------------- id | ref_num | name | email | ----------------------------- 订单状态表已更改 --------------------------- order_id | status_id --------------------- 我的模特是这样的 订

我有三个表一个是订单表,另一个是订单状态表,另一个是状态表。
order\u 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);
    }
订单状态模型

 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::一个订单可以有多种状态,如未付款、待处理、包装、运输中等,但按使用顺序排列

我添加了订单状态表图像。。正如您可以看到的那样,订单号有两条记录1,2表示它处于挂起状态,然后后期交付。或者您可以说已处理。其中as E02EAA4BE只有一条状态1记录。这意味着它仍然悬而未决。 因此,我只想得到那些仍然悬而未决的。没有交付。 这听起来有点复杂,希望我能正确地解释我想做什么。

更新

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

$data['orders'] =  Order::has('orderStatus', '=', 2)->whereHas('orderStatus', function ($q) {
            $q->where('status_id', 2);
        })->get()->toArray();
如果有两个状态记录与一个订单相关,且其中一个状态值为1,则此查询将返回订单记录。您可以使用您的确切条件对其进行更新。(如果您确定与订单相关的状态只有2个,并且该订单仍处于待决状态,则您可以删除第二个
,其中有

$data['orders'] =  Order::has('orderStatus', '=', 2)->get()->toArray();
您可以使用@digitaldriver建议的
多对多
关系。我还建议您遵循
多对多
关系

如果您使用的是
多对多
关系,则可以尝试以下查询

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


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

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

// Status model
public function orders(){ 
    return $this->belongsToMany(Order::class); 
}
这将正确地以
订单状态为轴心

要获取待定订单,查询将是:

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::with('orderStatus'=>函数($q){$q->where('status_id',2);})->latest()->take(10)->get()->toArray()
但这将给出订单状态为2的所有订单,如果某个订单的订单状态为2,3,4,那么该订单也会出现。我不希望发生这种情况,我只希望状态为1,2的订单会出现come@user7747472你试过了吗?有用吗?或者有什么问题吗?@ab_ab,hi ab出于某种原因返回了空对象,尽管我hv 3记录了我n order status table我的错,我在pivot连接中犯了一些错误。我正在获取数据。但它也显示了已交付的数据。您能否确认此查询返回的已交付订单在pivot表中只有两条记录?我喜欢此查询构建,但它是一个空对象。顺便说一句,我还想问一件事。因为我的订单状态表保存订单的所有事件,也就是说,如果订单已交付,则在收到订单时、包装时、装运时和交付时,状态表也会保存其记录。在这种情况下,是否可以仅过滤那些尚未处理到装运等仍处于挂起阶段的数据?我的不好,这是显示数据,但也显示了所有那些也被交付的