32

我是 laravel 和雄辩的新手,我不确定这是否可能。但我有 2 个具有一对多关系的表。一种是“位置”,一种是“用户”。一个位置可以有多个用户。

因此,如果我想获得所有用户的所有位置,我会这样做:

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

但我也想知道每个位置有多少用户,我试过这样做

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

但这没有用。

4

3 回答 3

37

如果您使用急切加载,则不会出现提到的 n+1 问题。

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

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

无论您有多少用户或位置,这都会导致三个查询。

  • 根据位置模型计算查询
  • 从位置中选择 *
  • select * from users where in

混淆源于这样一个事实:

$locations = Location::all();

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

但在这种情况下,它会为每个位置查询一次。

有关更多信息,请参阅文档:http: //laravel.com/docs/eloquent#eager-loading

于 2014-05-15T17:32:16.803 回答
12

您应该使用 justwithCount但我想它在 2012 年不可用。

所以它应该是这样的:

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

并且您将users_count在您的对象上有一个可用的属性。

阅读文档以获取更多详细信息:https ://laravel.com/docs/5.5/eloquent-relationships#querying-relations (向下滚动一下,您将看到Counting Related Models

于 2018-03-21T12:42:36.200 回答
8

您需要在每个位置记录上调用 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 回答