laravel - > count()vs - > get() - > count()

时间:2017-12-02 14:24:36

标签: laravel eloquent

为什么下面的两个陈述表现不同?第一个返回3,第二个返回1为$ progress。我认为数据库上的第一个聚合和服务器上的第二个聚合。所以他们仍然应该返回相同的值。

$progress = $this->user->userActivities()->select('date')
                ->groupBy('date')
                ->get()->count();

$progress =  $this->user->userActivities()->select('date')
                ->groupBy('date')
                ->count();

6 个答案:

答案 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()