Laravel:如何使用 group By 和 sum 并选择多字段

Posted

技术标签:

【中文标题】Laravel:如何使用 group By 和 sum 并选择多字段【英文标题】:Laravel : How to using group By with sum and select multi field 【发布时间】:2021-03-13 20:18:57 【问题描述】:

在我的 Laravel 项目中,我的 users 表包含 id 和 username ...等。 另一个名为预测器的表,它们都与 user_id 相关(一对多),现在我想创建一个数组,其中包含用户表中的用户名和预测器表中点字段的总和。 我尝试了很多东西,但没有像这样工作:

public function leader()
    
    $predects = Predector::selectRaw(' user_id ,sum(point) as points')->groupBy('user_id')->get();
    foreach($predects as $predect)
        $predect->User->username;
    
    return $predects;
    

但它给了我这个结果


    "user_id": 1,
    "points": "3",
    "user": 
        "id": 1,
        "username": "sarmed",
        "nat_id": "123456",
        "email_verified_at": null,
        "created_at": "2020-11-30T17:10:27.000000Z",
        "updated_at": "2020-11-30T17:10:27.000000Z"
    
,

我想要这样的东西:

 
        "user_id": 1,
        "points": "3",
        "username": "sarmed",
    ,

【问题讨论】:

查看这个帖子***.com/questions/21679678/… 【参考方案1】:

所以如果我理解正确,目标是获取用户所有点的总和,然后提供用户 id、点和用户名的数据集

假设用户模型上的关系为

class User extends Model

    public function predects()
    
        return $this->hasMany(Predector::class);
    

尝试下面的sn-p来达到想要的输出

public function leader()

    return User::query()
        ->with('predects:id,user_id,point')
        ->select('id', 'username')
        ->get()
        ->map(function($user)
            $predects = $user->predects;
            unset($user->predects);
            $user->points = $predects->sum('point');
            return $user;
        )
        ->sortByDesc('points')
        ->toArray();

对于低于 8.x 的 Laravel 版本,请查看 Laravel 子查询包 https://github.com/Alexmg86/laravel-sub-query 把事情简化一点

【讨论】:

【参考方案2】:

我通过添加这一行来解决它:

unset($predect->User);

现在是正确的代码:

public function leader()
    
        
        $predects = Predector::selectRaw(' user_id ,sum(point) as points')->groupBy('user_id')->orderBy('points','desc')->get();
        foreach($predects as $predect)
            $predect->username=$predect->User->username;
            unset($predect->User);
        
        return $predects;
    

结果是:

[
    
        "user_id": 2,
        "points": "7",
        "username": "sermedov"
    ,
    
        "user_id": 1,
        "points": "3",
        "username": "sarmed"
    
]

【讨论】:

以上是关于Laravel:如何使用 group By 和 sum 并选择多字段的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Laravel 中禁用 only_full_group_by 选项

如何在 Laravel 中使用具有多态关系的“group by”?

如何在laravel中将Group By与Join表一起使用[重复]

如何在 Laravel 8 中使用 PostgreSQL 中的子查询通过 group by 子句获取行值?

使用 group by 和 Laravel 获取最新行

如何解决 laravel eloquent 中与 sql_mode=only_full_group_by 不兼容的问题?