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 子句获取行值?
如何解决 laravel eloquent 中与 sql_mode=only_full_group_by 不兼容的问题?