0

Ich habe eine Tabelle namens invoiceDetails die item_id als foreign key aus einer anderen Tabelle, die category_id als foreign key namens items hat aus der Tabelle categories genannt.Laravel | Mit Eloquent hasManyThrough

ich tun möchte, dass folgende Verwendung eloquent:

$result = InvoiceDetail::groupBy('item_id') 
       ->selectRaw('sum(qty) as qty, item_id')->with('item', 'category')->get(); 

aber ich Störung erhalte:

Call to undefined relationship [category] on model [App\InvoiceDetail]. 

Hier ist meine Beziehung innerhalb Category Modell:

public function invoiceDetail() { 
     return $this->hasManyThrough('App\InvoiceDetail', 'App\Item', 'category_id', 'item_id'); 
} 

Irgendwelche Vorschläge?

+0

versuchen Sie, 'id', 'id' schließlich wie in [doc] erwähnt (https://laravel.com/docs/5.5/eloquent-relationships#has-many-through). Und ja Diese Methode sollte im InvoiceDetail-Modell geschrieben werden. Nicht in der Kategorie Modell – rahulsm

Antwort

0

Nicht sicher, Sie würden sogar eine hasManyThrough Beziehung hier benötigen, es sei denn, Sie alle InvoiceDatail Objekte gehören, für alle Elemente abrufen möchten, die zu der Kategorie wiederum gehören. Dieser Teil ist nicht klar aus Ihrer Frage.

Aber in Ihrem Beispiel holen Sie Artikel mit ihrer Kategorie aus distinct item_id.

Der Grund, warum dies nicht funktioniert, ist, weil Sie versuchen, die Kategorie Relation aus dem InvoiceDetail Objekt abzurufen, die nicht vorhanden ist.

->with('item', 'category') 

Sie wollen auf den Punkt Beziehung der Category basiert laden, nicht auf der Grundlage der InvoiceDetail, versuchen Sie die Punktnotation (vorausgesetzt, dass Sie die anderen Beziehungen definieren tat)

->with('item.category') 

Beziehungen sein sollte wie dies:

class InvoiceDetail extends Model 
{ 
    public function item() 
    { 
     return $this->belongsTo(\App\Item::class); 
    } 
} 

class Item extends Model 
{ 
    public function invoiceDetails() 
    { 
     return $this->hasMany(\App\InvoiceDetail::class); 
    } 

    public function category() 
    { 
     return $this->belongsTo(\App\Category::class); 
    } 
} 

class Category extends Model 
{ 
    public function items() 
    { 
     return $this->hasMany(\App\Item::class); 
    } 


    public function invoiceDetails() 
    { 
     return $this->hasManyThrough(\App\InvoiceDetail::class, \App\Item::class, 'category_id', 'item_id'); 
    } 
} 

Sie würden die hasManyThrough verwenden möchten, wenn Sie zum Beispiel eine Kategorie und Sie wollen alle InvoiceDetails laden direkt.

dd($category->invoiceDetails); 
+0

Große Antwort, die Punktnotation funktionierte. Könnten Sie bitte die Verwendung von 'hasManyThrough' verdeutlichen, da ich dort keine nützliche Referenz gefunden habe? – CairoCoder

+0

@CairoCoder Die Dokumentation hat tatsächlich ein ziemlich gutes Beispiel enthalten, siehe https://laravel.com/docs/5.5/eloquent-relationships#has-many-through – Robert

+0

da ist kein Reverse, oder? – CairoCoder