mardi 24 janvier 2017

Querying counts from large datasets using eloquent

I have the following relationships:

A Job has many Roles.

public function roles()
{
    return $this->hasMany(Role::class);
}

A Role has many Shifts and Assignments through shifts.

public function shifts()
{
    return $this->hasMany(Shift::class);
}


public function assignments()
{
    return $this->hasManyThrough(Assignment::class, Shift::class);
}

A Shift has many Assignments.

public function assignments()
{
    return $this->hasMany(Assignment::class);
}

I need to get a count of all assignments with a certain status, let's say "Approved". These counts are causing my application to go extremely slowly. Here is how I have been doing it:

foreach ($job->roles as $role){
    foreach ($role->shifts as $shift) {   
        $pendingCount = $shift->assignments()->whereStatus("Pending")->count();
        $bookedCount = $shift->assignments()->whereIn('status', ["Booked"])->count();
    }
}

I am certain that there must be a better, faster way. Some of these queries are taking upwards of 30+ seconds. There are hundreds of thousands of Assignments, which I know is affecting performance. How can I speed these querie up?



via Chebli Mohamed

Aucun commentaire:

Enregistrer un commentaire