2014-06-12 14 views
5

Có cách nào hợp nhất 2 mối quan hệ trong laravel không?Laravel merge reltationships

đây là cách thiết lập ngay bây giờ, nhưng có cách nào tôi có thể trả về cả hai được hợp nhất không?

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 
    } 

Trả lời

15

Thử phương thức getter cho thuộc tính trả về bộ sưu tập đã hợp nhất được trả về từ quan hệ.

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

Hoặc bạn có thể gọi các phương thức bổ sung trước khi bộ sưu tập được trả lại để nhận các tập hợp kết quả khác nhau.

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, đẹp không biết điều này tồn tại! thx – Kiwi

+0

Bạn có thể đọc thêm về các phương pháp thu thập sẵn có tại đây http://laravel.com/api/class-Illuminate.Support.Collection.html#methods – Andreyco

+0

Cải thiện câu trả lời. – Andreyco

3

Trong trường hợp bạn thích phương pháp hợp nhất() để kết hợp hai bộ sưu tập (mối quan hệ), nó sẽ ghi đè lên các yếu tố với các phím số tương tự như vậy bạn sẽ mất một số dữ liệu thu được từ một mối quan hệ.

Bạn nên chọn push() phương pháp thay vào đó, mà tạo ra các phím mảng mới bằng cách đẩy một bộ sưu tập đến hết bộ sưu tập khác

Đây là một mẫu:

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

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

Đây là câu trả lời đúng, để ngăn các khóa chính/chỉ mục khỏi quá tải. –