2012-11-02 43 views
27

Tôi mới đến laravel và hùng hồn và tôi không chắc chắn nếu điều này thậm chí có thể. nhưng tôi có 2 bảng với mối quan hệ một đến nhiều. Một là "vị trí" và một là "người dùng". Một vị trí có thể có nhiều người dùng.Laravel eloquent đếm một mối quan hệ

Vì vậy, nếu tôi muốn có được tất cả các địa điểm với tất cả người dùng Tôi sẽ chỉ làm điều này:

Location::with("users")->get(); 

Nhưng tôi cũng muốn biết có bao nhiêu người dùng mỗi địa điểm đã, tôi đã cố gắng làm điều này

Location::with("users")->count("users")->get(); 

Nhưng điều đó không hiệu quả.

+0

bạn đã làm gì cho đến nay để tìm hiểu? Ý tôi là không phải ai đó gợi ý điều gì đó bạn đã làm. – hakre

+0

Nếu được kiểm tra tài liệu nhưng không thể tìm thấy bất cứ điều gì về nó – Arcade

+0

Nếu 'Location :: with (" users ") -> get();' then 'Location :: with ("users") -> count() ; 'cũng có thể làm việc. Bạn đã thử điều đó chưa (tôi vừa quét tài liệu, chưa bao giờ sử dụng thư viện đó) ?. – hakre

Trả lời

34

Sự cố n + 1 đã được đề cập không xảy ra nếu bạn sử dụng tải mong muốn.

$locations = Location::with('users')->get(); 

$locations->users()->count(); 

Điều này sẽ dẫn đến ba truy vấn, bất kể bạn có bao nhiêu người dùng hoặc vị trí.

  • truy vấn số so với mô hình vị trí
  • select * from địa điểm
  • select * from người dùng nơi ở

Sự rắc rối nảy sinh từ thực tế rằng điều này cũng hoạt động:

$locations = Location::all(); 

$locations->users()->count(); 

Nhưng trong trường hợp này, nó sẽ truy vấn một lần cho từng vị trí.

Xem các tài liệu cho biết thêm: http://laravel.com/docs/eloquent#eager-loading

+9

Mặc dù đã trễ đến bữa tiệc, cũng giống như chỉ ra rằng bạn vẫn gặp vấn đề n + 1 với điều này.Bạn cần sử dụng '$ location> users-> count()' trong foreach, về cơ bản không truy cập vào phương thức users(), nhưng truy cập thuộc tính, hoặc nó thực hiện truy vấn mỗi lần. – David

+0

@David cảm ơn bạn rất nhiều, bạn đã giúp làm sáng tỏ sự nhầm lẫn khi tôi vẫn thấy vấn đề về n + 1. Nó sẽ giúp cập nhật câu trả lời này chính xác hơn. –

7

Bạn cần phải gọi phương thức đếm trên mỗi bản ghi Location để người dùng đếm mỗi vị trí, đây là một ví dụ:

foreach(Location::get() as $location) // or foreach(Location::with("users")->get() as $location) 
{ 
    echo $location->users()->count(); 
} 

này nên giải quyết vấn đề của bạn và cung cấp cho bạn số lượng người dùng cho mỗi vị trí. Bạn có thể thêm dấu kiểm vào vòng lặp để bỏ qua vị trí với số người dùng = 0

+6

Điều này có sử dụng nhiều truy vấn DB như kết quả từ Vị trí :: get() không? –

+32

Điều này thật tệ. Nó dẫn đến một vấn đề truy vấn [n + 1] (http://stackoverflow.com/questions/97197/what-is-the-n1-selects-issue?lq=1) – edi9999

+0

Trong trường hợp này, tốt hơn là sử dụng Bộ sưu tập. Vì vậy, bạn sử dụng PHP để đếm các mối quan hệ. '$ location-> users-> count()' –

Các vấn đề liên quan