@garethredfern, Have you tried to mount the query through the user?
make use of the eager load. https://laravel.com/docs/master/eloquent-relationships#eager-loading
// I'm guessing you have the following relationships in your App\User.php
// User hasMany results
function results() {
return $this->hasMany(App\Results::class);
}
// User hasMany compliances
function compliances() {
return $this->hasMany(App\Compilance::class);
}
// query
$usersWithMatrix = App\User::query()
->with([
'results' => function($results) use ($courseIds, $entityIds) {
$results
->select(
'course_id',
'expiry_warning',
'passed',
'score',
'type',
'user_id',
'expires',
'completed',
'attempt'
)
->whereIn('course_id', $courseIds)
->whereIn('entity_id', $entityIds)
->where('passed', true);
},
'compliances' => function($compilances) use ($courseIds) {
$compilances
->select(
'users.id AS user_id',
'users.name AS user',
'roles.name AS role',
'roles.id AS role_id',
'courses.id AS course_id',
'courses.title AS course_title',
'courses.short_title AS short_title',
'compliance.is_compliant AS is_compliant',
'compliance.include AS include',
'compliance.exclude AS exclude',
'compliance.type AS type'
)
->join('courses', 'courses.id', '=', 'compliance.course_id')
->join('roles', 'roles.id', '=', 'compliance.role_id')
->join('users', 'users.role_id', '=', 'roles.id')
->when(!empty($courseIds), function ($query) use ($courseIds) {
$query->whereIn('courses.id', $courseIds);
})->distinct('course_id');
},
])->get();
