Laravel Eloquent获取所有行及其各自的数据透视表行

时间:2017-11-02 13:38:08

标签: php mysql database laravel eloquent

我有一个订单表,其中包含存储在数据透视表中的订单项。

成功处理完所有订单项后,订单将被标记为“已处理”,并需要在页面上显示。

因此,我想要获取所有已标记为“已处理”的订单以及其各自订单中包含的订单项。

我的查询如下:

$orders = DB::table('order_product')
      ->join('products', 'order_product.product_id', '=', 'products.product_id')
      ->join('orders', 'order_product.order_id', '=', 'orders.order_id')
      ->join('customers', 'orders.customer_id', '=', 'customers.customer_id')
      ->where('order_product.variation_status', '=', 'dispatch')
      ->where('orders.store', '!=', 'null')
      ->groupBy('order_product.order_id')
      ->get();

 return response()->json($orders);

我的想法是获取所有已处理的数据透视表项,然后按 order_id 对结果进行分组,但遗憾的是这不起作用。

我收到以下输出: enter image description here

不幸的是,变体属性只包含数据透视表中的一个订单项,而不是两个。

有人可以帮我解决我可能做错的事吗?

更新

这是我的模特 Order.php

/**
     * The products that belong to the Order.
     */
    public function products()
    {
        return $this->belongsToMany('App\Product','order_product','order_id','product_id')
            ->withPivot(['qty', 'variation', 'variation_status'])
            ->withTimeStamps();
    }

    /**
     * The customer that belongs to the Order.
     */
    public function customer()
    {
        return $this->belongsTo('App\Customer', 'customer_id');
    }

Product.php

/**
     * The orders that belong to the product.
     */
    public function orders()
    {
        return $this->belongsToMany('App\Order')
            ->withPivot(['qty', 'variation_status'])
            ->withTimeStamps();
    }

1 个答案:

答案 0 :(得分:1)

我不能保证这是正确的,因为我通常不使用->withPivot并且没有运行测试环境所以现在这是我的头脑。但这可能会让您深入了解如何处理此用例。

让我们从订单作为基础开始

Order::get();

现在让我们扩展此功能以检索客户和产品的订单

Order::with('customer', 'products')->get();

我们现在要做的是解决上述雄辩查询中的条件:

->where('order_product.variation_status', '=', 'dispatch')
->where('orders.store', '!=', 'null')

您可以做的是:

Order::with(['products' => function($query){
  $query->where('variation_status', 'dispatch');
}, 'customer'])
->where('store','!=','NULL')
->get();