合并重复的Laravel对象

时间:2020-02-25 15:50:00

标签: php laravel

我正在排行榜上,每个用户在排行榜表上都有很多记录。这是它返回的对象

[
  {
    "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
  }
]

2 个答案:

答案 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')];
}

非常重要的最好方法是通过口才查询