我是新來laravel和雄辯,我不知道這是甚至可能的。但我有兩個表,一對多的關係。一個是「位置」,一個是「用戶」。一個位置可以有許多用戶。Laravel雄辯數數關係
所以,如果我想獲得所有用戶的所有位置,我只想做:
Location::with("users")->get();
但我也想知道有多少用戶每個位置了,我試着這樣做
Location::with("users")->count("users")->get();
但這並沒有奏效。
我是新來laravel和雄辯,我不知道這是甚至可能的。但我有兩個表,一對多的關係。一個是「位置」,一個是「用戶」。一個位置可以有許多用戶。Laravel雄辯數數關係
所以,如果我想獲得所有用戶的所有位置,我只想做:
Location::with("users")->get();
但我也想知道有多少用戶每個位置了,我試着這樣做
Location::with("users")->count("users")->get();
但這並沒有奏效。
如果您使用預先加載,則不會出現提到的n + 1問題。
$locations = Location::with('users')->get();
$locations->users()->count();
無論您擁有多少用戶或位置,這應導致三個查詢。其中
混亂對選址模型
$locations = Location::all();
$locations->users()->count();
但是在這種情況下,它會爲每個位置查詢一次。
儘管派對遲到了,就像指出你仍然得到這個n + 1的問題。你需要在foreach中使用'$ location> users-> count()',基本上不訪問方法users(),但訪問屬性,或者每次都執行查詢。 – David
@David非常感謝你,你幫我解決了困惑,因爲我仍然看到了n + 1問題。這將有助於更新此答案以更準確。 –
你需要調用每個位置記錄的計數方法來獲取用戶的每個位置算,這裏有一個例子:
foreach(Location::get() as $location) // or foreach(Location::with("users")->get() as $location)
{
echo $location->users()->count();
}
這應該解決您的問題,給你按每個位置的用戶數量。您可以在循環中添加一個檢查來忽略用戶數爲0的位置。
這會使用與Location :: get()的結果一樣多的DB查詢嗎? –
這很糟糕。它導致[n + 1查詢問題](http://stackoverflow.com/questions/97197/what-is-the-n1-selects-issue?lq=1) – edi9999
在這種情況下,使用Collection更好。因爲這樣你使用PHP來進行關係計數。 '$ location-> users-> count()' –
你做了什麼迄今爲止發現的?我的意思不是有人建議你已經做了什麼。 – hakre
如果一直在檢查文檔,但無法找到任何相關信息 – Arcade
如果'Location :: with(「users」) - > get();'Location :: with(「users」) - > count() ;'也可以工作。你有沒有試過(我剛剛掃描了文檔,從來沒有使用過這個庫)? – hakre