web-dev-qa-db-ja.com

Laravel関係を数える雄弁な

私はlaravelとeloquentに不慣れで、これが可能かどうかはわかりません。しかし、1対多の関係を持つ2つのテーブルがあります。1つは「場所」で、もう1つは「 1つの場所に多くのユーザーを含めることができます。

したがって、すべてのユーザーのすべての場所を取得したい場合は、次のようにします。

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

しかし、私はまた、何人のユーザーeach場所が持っているかを知りたいので、これを試してみました

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

しかし、それはうまくいきませんでした。

28
Arcade

熱心な読み込みを使用する場合、言及された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

36

場所ごとのユーザー数を取得するには、各Locationレコードのcountメソッドを呼び出す必要があります。以下に例を示します。

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

これで問題が解決し、場所ごとのユーザー数がわかります。ループにチェックを追加して、ユーザー数= 0の場所を無視できます

7
iTech

withCountだけを使用する必要がありますが、2012年には利用できなかったと思います。

したがって、次のようになります。

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

そして、あなたはusers_count属性はオブジェクトで使用できます。

詳細については、ドキュメントをご覧ください: https://laravel.com/docs/5.5/eloquent-relationships#querying-relations (少し下にスクロールすると、関連モデルのカウント

4
Bogdan