2016-10-13 9 views
0

ich wie so ein paar Tische haben ...Laravel Beziehungsstruktur mit Polymorphe Beziehungen

FreeLook  
    - id 

SignVendor 
    - id 

PaintVendor 
    - id 

VendorJob 
    - vendor_id 
    - vendor_type 
    - free_look_id 
    - quote_id 

Quote 
    - id 

Wenn ein PaintVendor oder SignVendor für eine FreeLook gewählt wird, ein VendorJob wird erstellt und es hat eine polymorphe Beziehung, so dass Ich kann eine Tabelle für beide Jobs SignVendor und PaintVendor verwenden. Also, essentiall, ich möchte, dies zu tun in der Lage sein ...

FreeLook::find(1)->signVendorJob // gets the sign vendor job from VendorJob for that freelook 

Hier kann ich keine belongsTo Beziehung verwenden, weil ich nicht zwischen einem Zeichen oder Farbe Verkäufer innerhalb der Abfrage (oder zumindest ich unterscheiden kann nicht weiß, von einer Art und Weise)

FreeLook::find(1)->signVendor // gets the sign vendor for that freelook 

Das Problem ist, dass ich das Zeichen Verkäufer durch die VendorJob bin immer und Laravel keine hasOneThrough

FreeLook::find(1)->signVendor->quote // gets the sign vendor quote from VendorJob for that freelook 

Seit ein SignVendor kann mehr als eine Quote, habe ich auf die FreeLook Zusammenhang das Angebot erhalten nur wollen, oder VendorJob

Werde muss ich für alle diese benutzerdefinierte MySQL-Abfragen schreiben, oder bin ich Dinge overcomplicating, oder einfach nur etwas vermissen?

Danke für jede Hilfe, die Sie sich leisten können!

Antwort

0

Sie die morph Beziehung verwenden, wie in den im Modell VendorJob

so

doc.s erwähnt

// the morph relation 
public function vendorable() 
{ 
    return $this->morphTo(); 
} 

// the quote relation 
public function quote() 
{ 
    return $this->hasOne('App\Quote'); 
} 

und in PaintVendor Modell

public function paintVendor() 
{ 
    return $this->morphMany('App\VendorJob', 'vendorable'); 
} 

und das gleiche für SignVendor. jetzt FreeLook::find(1)->signVendor wird eine Liste aller signVendor Datensätze zurück, so dass Sie eine Schleife wie sie haben werden:

foreach(FreeLook::find(1)->signVendor as $vendor) 
    { 
     // fetching the quote of every signVendor related to FreeLook num. 1 
     $vendor->quote; 
    } 

Ich hoffe, das Ihnen hilft.

Verwandte Themen