Laravel雄辩地计算了一种关系

时间:2012-11-02 14:56:57

标签: php laravel eloquent

我是laravel和eloquent的新手,我不确定这是否可行。但是我有2张桌子,有一对多的关系。一个是“位置”,一个是“用户”。一个位置可以有很多用户。

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

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

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

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

但那没用。

3 个答案:

答案 0 :(得分:35)

如果您使用预先加载,则不会出现提及的n + 1问题。

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

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

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

  • 根据位置模型计算查询
  • 从地点选择*
  • 中的用户中选择*

这种混淆起因于这也有效:

$locations = Location::all();

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

但在这种情况下,它会针对每个位置进行一次查询。

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

答案 1 :(得分:7)

您需要在每个位置记录上调用count方法以获取每个位置的用户数量,这是一个示例:

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

这可以解决您的问题并为您提供每个位置的用户数量。您可以在循环中添加一个检查以忽略用户的count = 0

的位置

答案 2 :(得分:1)

您应该只使用withCount,但我猜它在2012年无法使用。

所以这里应该是这样的:

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

您可以在对象上使用users_count属性。

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