我正在排行榜上,每个用户在排行榜表上都有很多记录。这是它返回的对象
[
{
"user_id": 3,
"user_name": "Langosh Troy",
"points": 78
},
{
"user_id": 3,
"user_name": "Langosh Troy",
"points": 76
},
{
"user_id": 1,
"user_name": "Crooks Elsa",
"points": 12
}
]
但是我希望它出现,以使具有 user_id = 3 的对象成为一个对象,因此我的最终返回值应该看起来像这样
[
{
"user_id": 3,
"user_name": "Langosh Troy",
"points": 154
},
{
"user_id": 1,
"user_name": "Crooks Elsa",
"points": 12
}
]
答案 0 :(得分:0)
使用与此类似的内容:
UserPoints::groupBy(['user_id','user_name'])
->selectRaw('sum(points) as sum, user_id, user_name')
->get();
我们在这里正在使用数据库组功能,该功能允许我们将某些数据库行分组为一行并使用某些组功能。 (总和就是添加点数字段的所有值,count将计算每个用户的行数,max将为该行提供每个用户的最大点数)
看看mysql提供的所有组功能:
https://dev.mysql.com/doc/refman/8.0/en/group-by-functions.html
答案 1 :(得分:0)
如果要使用口才查询,请尝试以下操作:
$records = User::query()->select(['sum(points) as points','user_id','user_name'])
->letfJoin('leaderboard','user_id','=','user.id')->groupBy(['user_id','user_name'])->get();
如果您想将其作为数组处理,也应该像这样
$users = User::all();
$result=[];
foreach($users as $user){
$result[]=['user_id'=$user->id,'user_name'=>$user->name, 'points'=>$user->leaderboards()->sum('points')];
}
非常重要的最好方法是通过口才查询