Laravel 拉威尔->;计数()与->;获取()->;计数()
为什么下面的两种说法表现不同?第一个返回3,第二个返回1表示$progress。我认为第一个聚合在DB上,第二个聚合在服务器上。所以它们仍然应该返回相同的值Laravel 拉威尔->;计数()与->;获取()->;计数(),laravel,eloquent,Laravel,Eloquent,为什么下面的两种说法表现不同?第一个返回3,第二个返回1表示$progress。我认为第一个聚合在DB上,第二个聚合在服务器上。所以它们仍然应该返回相同的值 $progress = $this->user->userActivities()->select('date') ->groupBy('date') ->get()->count(); $progress = $this->use
$progress = $this->user->userActivities()->select('date')
->groupBy('date')
->get()->count();
$progress = $this->user->userActivities()->select('date')
->groupBy('date')
->count();
第一个计算返回的记录数,第二个计算记录数并返回数字。例如,如果使用10的分页,则第一个分页将产生10,如果匹配元素的数量大于10,则第二个分页将产生实际数量。
->get()->count()
将把有说服力的模型对象加载到内存中,然后对这些对象进行计数
->count()
将使用DB aggregate函数,因此肯定会更高效:
select count(*) as aggregate ...
使用->get()->count()
是错误的。我在我的web应用程序中使用了->get()->count()
,当我的数据库记录超过80000条时,我的应用程序中出现错误500条。$count=Model::all()->count();
返回视图(“主视图”,压缩视图(“计数”);
这将适用于laravel 6 它们都返回相同的结果。但正如所说,为了防止崩溃或降低响应速度,最好使用
count()
而不是get()->count()
这是一个很晚的答案,但我也遇到了同样的问题。这两个示例返回两个不同的计数,因为您使用了groupBy
$progress = $this->user->userActivities()->select('date')
->groupBy('date')
->get()->count();
这将首先获取行,然后计算行号并返回计数
$progress = $this->user->userActivities()->select('date')
->groupBy('date')
->count();
而这将按其在数据库中的组对行进行计数,并仅从列表中返回第一个组的行记录计数
对于我的案例,我使用的解决方案(而不是get()->count())如下
$progress = $this->user->userActivities()
->distinct('date')
->count('date');
相反,第一个是PHP中的集合计数,第二个是DB中的行计数。然而,我从未见过他们会以不同的方式返回,第二种方式肯定会更有效。get()实际返回什么?