Home > Software engineering >  Laravel eloquent count total of participants that belongs to departments of one specific event
Laravel eloquent count total of participants that belongs to departments of one specific event

Time:10-22

My current query can count the number of participants that belongs to each department:

$departments = Department::select(['departments.id', 'departments.name'])
            ->with('participants')
            ->withCount('participants')
            ->orderByDesc('participants_count')
            ->groupBy('departments.name')
            ->groupBy('departments.id')
            ->get();

I have a table departments and another called participants. In the participants table there is fk_key called department_id of this way when one participant is beign registering I need the select his department.

Inside the model Department I have a relation hasMany with Participant:

 public function participants() {
        return $this->hasMany(Participant::class, 'department_id');
    }

Using this relation I can execute the query of above and I get something like this:

#DepartName   #participants_count
department_1  12
department_2  5
department_3  44
department_4  33

Here there is not problems for me. But the problems comes here. First, in my database exists a tabla called events and another table called event_participant. I can register events, and in a pivot table event_participant I can register the participants to the events and control the state of the payment of the participants of each event.

This pivot table has this columns:

event_participant

id  | event_id  | participant_id | payment_state

My model Event has a relation called participants and using this relation I can get all the participants that belongs of each event.

 public function participants() {
         return $this->belongsToMany(Participant::class, 'event_participant',
                                                      'event_id',
                                                      'participant_id')
                                                     ->withTimestamps();

}

Now I want count the total of participants of each department like the query of above but of one specific event.

For example: Exists two events, for the first event 10 participants were registered, of this 10 participants 5 belogns to the department A and 5 to the department B and all this participants belogns to the event 1. And in my database exists 5 departments I should get something like this for this example of the event one:

#departName     #participants_count
department_A    5
department_B    5
department_C    0
department_D    0
department_E    0

I hope you can understand me, this report is only for the event one. My idea is get all the departments with his total of participants of x event. To register the participants to the events I'm using a pivot table called event_participant.

Thanks so much.

Note. I'm using softdeletes on the Event, Department and Participant model.

CodePudding user response:

You can add additional constraints to the withCount.

I skipped other parts of your original query.

$eventName = 'xyz';

$departments = Department::withCount(['participants' => function ($query) use ($eventName) {
    $query->whereHas('events', function ($query) use ($eventName) {
        $query->where('name', $eventName);
    });
}])->orderByDesc('participants_count')->get();

https://laravel.com/docs/8.x/eloquent-relationships#counting-related-models

  • Related