为什么下面的两个陈述表现不同?第一个返回3,第二个返回1为$ progress。我认为数据库上的第一个聚合和服务器上的第二个聚合。所以他们仍然应该返回相同的值。
$progress = $this->user->userActivities()->select('date')
->groupBy('date')
->get()->count();
$progress = $this->user->userActivities()->select('date')
->groupBy('date')
->count();
答案 0 :(得分:5)
这是很晚的答案,但我遇到了同样的问题。由于您使用了 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');
答案 1 :(得分:2)
->get()->count()
会将Eloquent模型对象加载到内存中,然后对其进行计数。
->count()
将使用数据库聚合函数,因此它肯定会更有效:
select count(*) as aggregate ...
答案 2 :(得分:0)
第一个计算返回记录的数量,第二个计算记录并返回数字。例如,如果您使用10的分页,那么如果数学元素的数量大于10,则第一个将产生10,第二个将产生实际数字。
答案 3 :(得分:0)
使用->get()->count()
是错误的。我在Web应用程序中使用了->get()->count()
,当我的数据库记录超过80000条记录时,我的应用程序中出现错误500。
答案 4 :(得分:0)
$("#search-box").click(function(e){
$("#header-logo").addClass("hide");
e.stopPropagation();
});
这将适用于laravel 6;
答案 5 :(得分:-1)
它们两个都返回相同的结果。但是,为了防止崩溃或降低响应速度,最好使用count()而不是get()-> count()