对集合中的Laravel sum()方法返回表中所有项的结果

时间:2015-06-14 01:20:27

标签: php mysql eloquent laravel-5

给出下表

gallery
+----+---------------+--------------+---------+
| id | gallery_title |   viewcount  | user_id |
+----+---------------+--------------+---------+
|  1 | Animals       |           10 |       1 |
|  2 | Cars          |            5 |       1 |
|  3 | Houses        |            2 |       2 |
+----+---------------+--------------+---------+

user
+----+----------+
| id | username |
+----+----------+
|  1 | Bob      |
|  2 | James    |
+----+----------+

以及以下课程

class Gallery extends Model
    ....    
    public function user()
    {
        return $this->belongsTo('App\User');
    }

class User extends Model
    ....
    public function galleries()
    {
        return $this->hasMany('App\Gallery');
    }

调用$galleryCollections= Auth::user()->galleries;返回一个集合数组,我可以在其中迭代

foreach ($galleryCollections as $galleryCollection)
{
    $viewcount += $galleryCollection->viewcount;
}

print $viewcount; #returns 15

到目前为止,一切都按预期工作,正确到此为止。

但是,如果我意外地调用$galleryCollection->sum('viewcount'),这是迭代中的最后一个值,则返回值为17,因为它只是运行以下SQL select sum('viewcount') as aggregate from 'gallery'

我很难理解这里到底发生了什么。这几乎就像它在gallery类本身上调用'sum()'方法而不传递任何'where'值。我至少期望它在Collection上调用sum()方法,而是回到数据库。

是因为我的Gallery类没有实现'sum()'方法,因此它使用Parent Model类并忽略Gallery类?

1 个答案:

答案 0 :(得分:0)

如果你想通过sql计算,那么:

Auth::user()->galleries()->sum('viewCount');

但是,Auth::user()->galleries->sum('viewCount');会对集合Auth::user()->galleries求和。 Auth::user()->galleries()是一个queryBuilder,而Auth::user()->galleries是该用户的一组画廊。