2017-05-09 135 views
2

我有三個型號,訂購,OrderProduct和產品。 OrderProduct是創建存儲信息(如價格或數量)的Order和Product關係的表。在我的產品清單行動中,我需要顯示每件產品有多少訂單已開啓(掛起或付款)。所以我想急於負載這種關係是這樣的:Laravel預先加載計數關係

// ProductController.php 

public function index() 
{ 
    $data = Product::with(['reservedStock']); 

    return $data; 
} 

而且

//Product.php 

public function reservedStock() 
{ 
    return $this->hasMany(OrderProduct::class, 'product_sku') 
     ->selectRaw('order_products.product_sku, count(*) as count') 
     ->join('orders', 'orders.id', 'order_products.order_id') 
     ->whereIn('orders.status', [Order::STATUS_PENDING, Order::STATUS_PAID]); 
} 

它的工作原理,但是從它的反應是這樣的一個數組:

{ 
    "sku": 384, 
    "brand_id": null, 
    "line_id": null, 
    "title": "Alcatel Pixi 4 Colors OT4034E 8GB 3G Preto", 
    "ean": null, 
    "ncm": 85171231, 
    "price": "315.44", 
    "cost": "0.00", 
    "condition": 0, 
    "warranty": null, 
    "created_at": "2016-08-25 10:45:40", 
    "updated_at": "2017-03-30 17:51:07", 
    "deleted_at": null, 
    "reserved_stock": [ 
     { 
      "product_sku": 384, 
      "count": 4 
     } 
    ] 
} 

我想只有計數reserved_stock: 4

如何做任何想法?

PS:我已經嘗試過做withCount位與它我無法創建訂單表的連接通過訂單狀態進行過濾。

+0

讀這可能會幫助您:HTTP://計算器.COM /問題/ 20770284/laravel-的hasMany - 關係 - 數數 - 的 - 喜歡 - 和 - 評論 - 在崗 – Daan

+0

@Daan它不是預先加載。我只想爲我的所有產品提供一個查詢。在你引用之後,他創建了另一個屬性count,然後我把它稱爲foreach或其他東西。我需要在顯示之前加載它。 –

+0

您只能返回計數數字。 '返回計數($ product-> reservedStock);'? –

回答

2

你可以做一些如下的關係可能需要一些修補:

public function reservedStockCount() 
{ 
    return $this->belongsToMany(OrderProduct::class) 
     ->selectRaw('order_products.id, count(*) as aggregate_reserved_stock') 
     ->join('orders', 'orders.id', 'order_products.order_id') 
     ->whereIn('orders.status', [Order::STATUS_PENDING, Order::STATUS_PAID]); 
     ->groupBy('order_products.id'); 
} 

public function getReservedStockCount() 
{ 
    // if relation is not loaded already, let's do it first 
    if (!array_key_exists('reservedStockCount', $this->relations)) { 
     $this->load('reservedStockCount'); 
    } 

    $related = $this->getRelation('reservedStockCount')->first(); 
    // then return the count directly 
    return ($related) ? (int) $related->aggregate_reserved_stock : 0; 
} 

,可以使用如下:

Product::with(['reservedStockCount']); 

Product->getReservedStockCount(); 
+0

它的工作!因爲我用laravel作爲API,我需要創建一個自定義屬性和使用方法,其追加到我的模型。謝謝! –

+2

很高興能幫到你! –