私はlaravelとeloquentに不慣れで、これが可能かどうかはわかりません。しかし、1対多の関係を持つ2つのテーブルがあります。1つは「場所」で、もう1つは「 1つの場所に多くのユーザーを含めることができます。
したがって、すべてのユーザーのすべての場所を取得したい場合は、次のようにします。
Location::with("users")->get();
しかし、私はまた、何人のユーザーeach場所が持っているかを知りたいので、これを試してみました
Location::with("users")->count("users")->get();
しかし、それはうまくいきませんでした。
熱心な読み込みを使用する場合、言及されたn + 1の問題は発生しません。
$locations = Location::with('users')->get();
$locations->users()->count();
これにより、ユーザーや場所の数に関係なく、3つのクエリが生成されます。
これも機能するという事実から、混乱が生じます。
$locations = Location::all();
$locations->users()->count();
ただし、この場合は、場所ごとにクエリを1回実行します。
詳細についてはドキュメントを参照してください: http://laravel.com/docs/eloquent#eager-loading
場所ごとのユーザー数を取得するには、各Locationレコードのcountメソッドを呼び出す必要があります。以下に例を示します。
foreach(Location::get() as $location) // or foreach(Location::with("users")->get() as $location)
{
echo $location->users()->count();
}
これで問題が解決し、場所ごとのユーザー数がわかります。ループにチェックを追加して、ユーザー数= 0の場所を無視できます
withCount
だけを使用する必要がありますが、2012年には利用できなかったと思います。
したがって、次のようになります。
Location::with("users")->withCount("users")->get();
そして、あなたはusers_count
属性はオブジェクトで使用できます。
詳細については、ドキュメントをご覧ください: https://laravel.com/docs/5.5/eloquent-relationships#querying-relations (少し下にスクロールすると、関連モデルのカウント)