2015-05-29 21 views
17

Tôi có bảng câu hỏi và bảng thẻ. Tôi muốn tìm tất cả các câu hỏi từ các thẻ của một câu hỏi nhất định. Vì vậy, ví dụ, tôi có thể có các thẻ "Du lịch", "Xe lửa" và "Văn hóa" gắn liền với một câu hỏi nhất định. Tôi muốn có thể tìm nạp tất cả các câu hỏi cho ba thẻ đó. Các khó khăn, do đó, có vẻ như, là câu hỏi và thẻ mối quan hệ là một nhiều-nhiều trong Eloquent được định nghĩa là thuộcToMany.Làm cách nào để hợp nhất hai bộ sưu tập hùng hồn?

Tôi nghĩ về cố gắng để kết hợp các câu hỏi sưu tập như sau:

foreach ($question->tags as $tag) { 
    if (!isset($related)) { 
     $related = $tag->questions; 
    } else { 
     $related->merge($tag->questions); 
    } 
} 

Nó dường như không làm việc mặc dù. Dường như không hợp nhất bất cứ thứ gì. Tôi đang cố gắng này một cách chính xác? Ngoài ra, có lẽ một cách tốt hơn để lấy một hàng các hàng trong một mối quan hệ nhiều-nhiều trong Eloquent?

+0

Bạn có kiểm tra tài liệu về tải mong muốn và phương pháp không? Vấn đề của bạn có thể dễ dàng được giải quyết bằng cách sử dụng truy vấn hùng hồn hơn. Một khi tôi nhận được đằng sau một máy tính tôi sẽ viết một ví dụ, trừ khi ai đó đánh tôi với nó. – Luceos

+1

@Luceos 'with' sẽ không giúp ích gì. Đó là 'whereHas' đó là cần thiết - như trong câu trả lời dưới đây. –

+0

vâng, sai lầm của tôi; bạn đúng là – Luceos

Trả lời

8

Phương thức merge() trên Collection không sửa đổi bộ sưu tập mà trên đó nó được gọi. Nó trả về một bộ sưu tập mới với các dữ liệu mới sáp nhập trong Bạn sẽ cần:.

$related = $related->merge($tag->questions); 

Tuy nhiên, tôi nghĩ rằng bạn đang giải quyết vấn đề từ góc độ sai.

Vì bạn đang tìm kiếm các câu hỏi đáp ứng một tiêu chí nhất định, có thể sẽ dễ dàng hơn để truy vấn theo cách đó. Các phương thức has()whereHas() được sử dụng để tạo truy vấn dựa trên sự tồn tại của một bản ghi có liên quan.

Nếu bạn chỉ đang tìm câu hỏi có bất kỳ thẻ nào, bạn sẽ sử dụng phương thức has(). Vì bạn đang tìm kiếm câu hỏi với một thẻ cụ thể, bạn sẽ sử dụng số whereHas() để thêm điều kiện.

Vì vậy, nếu bạn muốn tất cả những câu hỏi mà có ít nhất một thẻ với một trong hai 'Travel', 'Trains', hoặc 'Văn hóa', truy vấn của bạn sẽ trông như thế:

$questions = Question::whereHas('tags', function($q) { 
    $q->whereIn('name', ['Travel', 'Trains', 'Culture']); 
})->get(); 

Nếu bạn muốn tất cả câu hỏi mà có cả ba của những thẻ, truy vấn của bạn sẽ trông như thế:

$questions = Question::whereHas('tags', function($q) { 
    $q->where('name', 'Travel'); 
})->whereHas('tags', function($q) { 
    $q->where('name', 'Trains'); 
})->whereHas('tags', function($q) { 
    $q->where('name', 'Culture'); 
})->get(); 
+0

+, tuy nhiên tùy chọn thứ 2 (tất cả các thẻ) bạn đề xuất có thể được đơn giản hóa: http://stackoverflow.com/a/24706347/784588 –

+0

nhưng bạn không thể mã hóa các tên thẻ.Trong ví dụ này, câu hỏi xảy ra là có các thẻ đó, nhưng trong các câu hỏi khác, các thẻ sẽ khác nhau –

45

phương pháp hợp nhất trả về bộ sưu tập sáp nhập, nó không đột biến bộ sưu tập ban đầu, do đó bạn cần phải làm như sau

$original = new Collection(['foo']); 

$latest = new Collection(['bar']); 

$merged = $original->merge($latest); // Contains foo and bar. 

Áp dụng ví dụ để mã của bạn

$related = new Collection(); 

foreach ($question->tags as $tag) 
{ 
    $related = $related->merge($tag->questions); 
} 
+0

Tôi đang cố gắng xây dựng một danh sách phẳng từ một cái cây, sử dụng push là những gì tôi cần, nhưng phương pháp foreach thực sự hữu ích. – George

0

Hợp nhất hai bộ sưu tập hùng hồn khác nhau vào một và một số đối tượng xảy ra để có id giống nhau, ai sẽ ghi đè lên người kia. Sử dụng phương thức push() thay vào đó hoặc suy nghĩ lại cách tiếp cận của bạn cho vấn đề để tránh điều đó. Refer to web

-1
$users = User::all(); 
$associates = Associate::all(); 

$userAndAssociate = $users->merge($associates); 
Các vấn đề liên quan