2012-11-02 310 views
27

我是新來laravel和雄辯,我不知道這是甚至可能的。但我有兩個表,一對多的關係。一個是「位置」,一個是「用戶」。一個位置可以有許多用戶。Laravel雄辯數數關係

所以,如果我想獲得所有用戶的所有位置,我只想做:

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

但我也想知道有多少用戶每個位置了,我試着這樣做

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

但這並沒有奏效。

+0

你做了什麼迄今爲止發現的?我的意思不是有人建議你已經做了什麼。 – hakre

+0

如果一直在檢查文檔,但無法找到任何相關信息 – Arcade

+0

如果'Location :: with(「users」) - > get();'Location :: with(「users」) - > count() ;'也可以工作。你有沒有試過(我剛剛掃描了文檔,從來沒有使用過這個庫)? – hakre

回答

34

如果您使用預先加載,則不會出現提到的n + 1問題。

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

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

無論您擁有多少用戶或位置,這應導致三個查詢。其中

混亂對選址模型

  • SELECT * FROM位置
  • SELECT * FROM用戶

    • 數查詢產生的事實,這也適用:

      $locations = Location::all(); 
      
      $locations->users()->count(); 
      

      但是在這種情況下,它會爲每個位置查詢一次。

      查看文檔的更多信息: http://laravel.com/docs/eloquent#eager-loading

  • +9

    儘管派對遲到了,就像指出你仍然得到這個n + 1的問題。你需要在foreach中使用'$ location> users-> count()',基本上不訪問方法users(),但訪問屬性,或者每次都執行查詢。 – David

    +0

    @David非常感謝你,你幫我解決了困惑,因爲我仍然看到了n + 1問題。這將有助於更新此答案以更準確。 –

    7

    你需要調用每個位置記錄的計數方法來獲取用戶的每個位置算,這裏有一個例子:

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

    這應該解決您的問題,給你按每個位置的用戶數量。您可以在循環中添加一個檢查來忽略用戶數爲0的位置。

    +6

    這會使用與Location :: get()的結果一樣多的DB查詢嗎? –

    +32

    這很糟糕。它導致[n + 1查詢問題](http://stackoverflow.com/questions/97197/what-is-the-n1-selects-issue?lq=1) – edi9999

    +0

    在這種情況下,使用Collection更好。因爲這樣你使用PHP來進行關係計數。 '$ location-> users-> count()' –