2017-02-08 3 views
0

Ich bin in einem Controller für Laravel 5.2 und versuche, durch eine eloquente Sammlung von invoice_items zu iterieren, die zu etwas wie Bestellpositionen übersetzen würde. So würde die Rechnung als die Bestellung fungieren, hätte sie bestellte Artikel (invoice_item), und die Rechnungsartikel würden alle bestellten Produkte (Produkt) auflisten.Laravel 5.2 Eloquente foreach-Schleife

Hier ist, was ich habe:

$id = $value; //from param 
$invoice = Invoice::where('id', $id)->get(); 
$invoice_items = Invoice_item::all()->where('invoice_id', $invoice[0]->id); 

$contact = Contact::where('id', $invoice[0]->contact_id)->get(); 

foreach($invoice_items as $item) { 
    $products = Product::all()->where('id', $item->product_id); 
} 

Ich versuche, alle Produkte aus dieser bestimmten Rechnung zu ziehen (über Rechnungspositionen), die in diesem speziellen Fall sollten zwei verschiedene Produkte.

Was passiert, ist, wenn ich durch diese Schleife iterieren, fügt es das gleiche Produkt zweimal hinzu, während es jedes Produkt einmal hinzufügen sollte. Ist meine Logik hier falsch? Oder muss ich meine Beziehungen noch einmal anschauen oder so?

+0

Versuchen Sie 'get()' anstelle von 'all()' wenn 'where()' verwendet wird. – aynber

+0

get() gibt leider die gleiche Ausgabe. Danke für die schnelle Antwort! –

Antwort

1

Ihre Anfragen ändern:

$invoice = Invoice::where('id', $id)->get(); 
$invoice_items = Invoice_item::where('invoice_id', $invoice[0]->id)->get(); 

$contact = Contact::where('id', $invoice[0]->contact_id)->get(); 

foreach($invoice_items as $item) { 
    $products = Product::where('id', $item->product_id)->get(); 
} 

Ein einfacher Weg sein kann, einen Artikel Bezug auf das InvoiceItems Modell hinzuzufügen. ZB:

public function items() 
{ 
    $this->hasOne('Items'); 
} 

Dann Sie alle Produkte von INVOICE_ITEM bekommen kann mit:

return $invoice_items->items; 

Sie können auch versuchen:

$invoice = Invoice::where('id', $id)->get(); 
$invoice_items = Invoice_item::where('invoice_id', $invoice[0]->id)->get()->lists('product_id'); 

$contact = Contact::where('id', $invoice[0]->contact_id)->get(); 

$products = Product::whereIn('id', $invoice_items)->get(); 

Hoffentlich $products wird dann eine Sammlung enthalten von Produkten für diese Rechnung. Keine Notwendigkeit für eine foreach-Schleife.

+0

Danke für das Feedback - Ich werde diese andere Beziehung versuchen, wenn ich die Chance habe zu sehen, ob das funktioniert. Das Ändern der Abfrage in der foreach-Schleife funktioniert jedoch weiterhin nicht. Was tatsächlich passiert, ist, dass die Abfrage nur ein Produkt innerhalb der Schleife zieht. Das $ products-Objekt enthält also nur das letzte Produkt oder das aus der zweiten Iteration gezogene Produkt. Ich denke, das einzig logische ist, es in ein Array zu schieben. Ich wollte einfach nur fortwährend mit einem Objekt arbeiten. –

+1

Ich habe meine Antwort mit einem anderen Beispiel aktualisiert, das Sie ausprobieren können, ohne foreach loop. Lass mich wissen wie es geht. –

+0

Das hat perfekt funktioniert! Ich habe eine temporäre Variable invoice_items erstellt, nur weil ich immer noch vollen Zugriff auf diese Objekte in der Ansicht benötigt habe, aber die Methode -> lists() auf der jetzt temp hat gut funktioniert. Yay! Keine Notwendigkeit für Arrays. Danke noch einmal! –