2014-06-12 4 views
5

Gibt es eine Möglichkeit, 2 Beziehungen in Laravel zusammenführen?Laravel Merge reltationships

Dies ist die Art, wie es jetzt eingerichtet wird, aber gibt es eine Möglichkeit, dass ich beides zusammengeführt zurückgeben könnte?

public function CompetitionsHome() { 
    return $this->HasMany('Competition', 'home_team_id'); 
    } 
    public function CompetitionsGuest() { 
    return $this->HasMany('Competition', 'guest_team_id'); 
    } 
    public function Competitions() { 
    // return both CompetitionsHome & CompetitionsGuest 
    } 

Antwort

15

Probieren Sie Getter-Methode für die Eigenschaft aus, die zusammengeführte Sammlungen zurückgegeben von Relationen zurückgibt.

public function getCompetitionsAttribute($value) 
{ 
    // There two calls return collections 
    // as defined in relations. 
    $competitionsHome = $this->competitionsHome; 
    $competitionsGuest = $this->competitionsGuest; 

    // Merge collections and return single collection. 
    return $competitionsHome->merge($competitionsGuest); 
} 

Oder Sie können zusätzliche Methoden aufrufen, bevor die Sammlung zurückgegeben wird, um verschiedene Ergebnismengen zu erhalten.

public function getCompetitionsAttribute($value) 
{ 
    // There two calls return collections 
    // as defined in relations. 
    // `latest()` method is shorthand for `orderBy('created_at', 'desc')` 
    // method call. 
    $competitionsHome = $this->competitionsHome()->latest()->get(); 
    $competitionsGuest = $this->competitionsGuest()->latest()->get(); 

    // Merge collections and return single collection. 
    return $competitionsHome->merge($competitionsGuest); 
} 
+0

Wow, schön nicht wusste, das existiert! thx – Kiwi

+0

Sie können mehr über verfügbare Collection-Methoden hier lesen http://laravel.com/api/class-Illuminate.Support.Collection.html#methods – Andreyco

+0

Verbesserte die Antwort. – Andreyco

3

Falls Sie lieber merge() -Methode zwei Sammlungen (Beziehungen) zu kombinieren, wird es Elemente mit dem gleichen Indexschlüssel außer Kraft setzen, so dass Sie von einer Beziehung gewonnen einige Ihrer Daten verlieren.

sollten Sie wählen, push() -Methode statt, die durch Drücken einer Sammlung an das Ende einer anderen Sammlung neue Array-Schlüssel erstellt

Hier ist ein Beispiel:

public function getCompetitionsAttribute($value) { 
    $competitionsHome = $this->competitionsHome; 
    $competitionsGuest = $this->competitionsGuest; 

    // PUSH ONE TO OTHER! 
    return $competitionsHome->push($competitionsGuest); 
} 
+0

Dies ist die richtige Antwort, um zu verhindern, dass Primär-/Indexschlüssel überschrieben werden. –