How to get sum of of sums in laravel on to many to many relationship in laravel

Viewed 48

I have a User table that have many TeamMember and each TeamMember have many Order. My query look like this at the moment:

$users = User::select('id', 'username')
    ->with(['userTeamMembers' => function ($query) { 

        $query->select('team_lead_id', 'team_member_id')
        ->withSum('completedOrders', 'amount')
        ->whereHas('completedOrders');

    }])
    ->whereHas('userTeamMembers.completedOrders')
    ->get()
    ->toArray();

The output:

[
{
    "id": 1,
    "username": "user1",
    "user_team_members": [
        {
            "team_lead_id": 1,
            "team_member_id": 19,
            "completed_orders_sum_amount": "100.00"
        },
        {
            "team_lead_id": 1,
            "team_member_id": 34,
            "completed_orders_sum_amount": "200.00"
        },
        
    ]
},
{
    "id": 5,
    "username": "user5",
    "user_team_members": [
        {
            "team_lead_id": 5,
            "team_member_id": 25,
            "completed_orders_sum_amount": "50.00"
        },
        {
            "team_lead_id": 5,
            "team_member_id": 67,
            "completed_orders_sum_amount": "50.00"
        },
        
    ]
}
]

But what I'm trying to achieve is a result like below:

[
{
    "id": 1,
    "username": "user1",
    "user_team_members_sum": "300.00"
},
{
    "id": 5,
    "username": "user5",
    "user_team_members_sum": "100.00"
}
]

As you can see, all of the team members total are added together compared to the former output. Is the result like above achievable? My Models are like below:

User Model

class User extends Authenticatable
{
     ...

     public function userTeamMembers()
     {
         return $this->hasMany(TeamMember::class, 'team_lead_id');
     }
}

Team Member Model

class TeamMember extends Model
{
     ....

     public function completedOrders()
     {
        return $this->hasMany(Order::class, 'user_id', 'team_member_id')->select('user_id', 'amount')->where('status', 1);
      }
}
1 Answers
// Try this. It could serve your desire output
$users = User::select('id', 'username')
    ->withSum('userTeamMembers.completedOrders', 'amount')
    ->whereHas('userTeamMembers.completedOrders')
    ->get()
    ->toArray();
Related