32

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

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

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

しかし、各場所のユーザー数も知りたいので、これを試してみました

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

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

4

3 に答える 3

37

前述の n+1 の問題は、熱心な読み込みを使用すると発生しません。

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

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

これにより、ユーザーや場所の数に関係なく、3 つのクエリが発生するはずです。

  • 位置モデルに対する count クエリ
  • select * ロケーションから
  • select * from users where in

混乱は、これも機能するという事実から生じます。

$locations = Location::all();

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

ただし、この場合は、場所ごとに 1 回クエリを実行します。

詳細については、ドキュメントを参照してください: http://laravel.com/docs/eloquent#eager-loading

于 2014-05-15T17:32:16.803 に答える
8

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

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

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

于 2012-11-13T08:36:05.730 に答える