2014-06-12 24 views
5

Czy istnieje sposób na połączenie 2 relacji w laravel?Laravel relacje fuzji

to jest sposób, w jaki jest teraz skonfigurowany, ale czy istnieje sposób, w jaki mogę zwrócić oba połączone?

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 
    } 

Odpowiedz

15

Wypróbuj metodę getter dla właściwości, która zwraca scalone kolekcje zwrócone z relacji.

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

Lub możesz wywołać dodatkowe metody przed zwróceniem kolekcji, aby uzyskać różne zestawy wyników.

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, miła nie wiem to istnieje! thx – Kiwi

+0

Możesz przeczytać więcej o dostępnych metodach zbierania tutaj http://laravel.com/api/class-Illuminate.Support.Collection.html#methods – Andreyco

+0

Ulepszono odpowiedź. – Andreyco

3

W przypadku (metoda łączenia dwóch kolekcji (relacji), zastąpi on elementy z tych samych kluczy indeksowych tak tracisz niektórych swoich danych uzyskanych z jednego związku scalania) wolisz.

Należy wybrać metodę push() zamiast, który tworzy nowe klucze tablicy przez naciśnięcie jednego kolekcję do końca drugiej kolekcji

Oto przykład:

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

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

To jest poprawna odpowiedź, aby zapobiec overridding kluczy podstawowych/indeksu. –