2017-05-09 4 views
2

Ich habe drei Modelle, Bestellung, BestellungProdukt und Produkt. OrderProduct ist die Tabelle, die die Beziehung aus Bestellung und Produkt erstellt, die Informationen wie Preis oder Menge speichert. In meiner Produktlistenaktion muss ich zeigen, wie viele Bestellungen für jedes Produkt offen (ausstehend oder bezahlt) sind. Also ich versuche, zu eifrig Last diese Beziehung wie folgt aus:Laravel eifrig Ladezahl Beziehung

// ProductController.php 

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

    return $data; 
} 

Und

//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]); 
} 

Es funktioniert, aber die Antwort von ihm ist ein Array wie folgt aus:

{ 
    "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 
     } 
    ] 
} 

Ich möchte nur die Zählung reserved_stock: 4.

Irgendwelche Ideen darüber, wie es geht?

ps: Ich habe bereits versucht withCount Bit damit ich bin nicht in der Lage, die Join aus Bestellungen Tabelle zu filtern nach Auftragsstatus zu erstellen.

+0

Lesen dieses Sie wahrscheinlich helfen: http: // Stackoverflow .com/questions/20770284/laravel-hasmany-relation-count-Anzahl-der-Likes-und-Kommentare-on-post – Daan

+0

@Daan es ist nicht eifrig laden. Ich möchte nur eine Abfrage für alle meine Produkte. Ihrer Referenz folgend, hat er ein anderes Attribut erstellt, nämlich die Anzahl, und dann rufe ich dies auf einer foreach oder etwas an. Ich muss das vor dem Anzeigen laden. –

+0

Sie können nur Zählnummern zurückgeben. 'return count ($ product-> reservedStock);'? –

Antwort

2

Sie können etwas tun, wie folgt, ist die Beziehung könnte etwas Herumprobieren brauchen:

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; 
} 

und kann wie folgt verwendet werden:

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

Product->getReservedStockCount(); 
+0

Es hat funktioniert! Da ich Laravel als API verwende, musste ich ein benutzerdefiniertes Attribut erstellen und es mit meiner Methode an mein Modell anhängen. Vielen Dank! –

+2

Ich bin froh, dass ich helfen konnte! –