Я наткнулся на тот же подход, но когда таблица стала больше (core_challenges_table в вашем сценарии), whereHas
оказался очень медленным (около 1 минуты времени отклика).
Итак, я использовал решение, подобное этому:
$ids = CoreChallenge::where('status', 'active')->pluck('id');
$challenges = Challenge::with('core_challenges')
->whereIn('core_challenge_id', $ids)
->get();
При таком подходе мой запрос сократился до 600 мс с 1 минуты.
Что можно перевести на объемы моделей
class Challenge {
public function scopeActive($query) {
$activeIds = CoreChallenge::where('status', 'active')->pluck('id');
return $query->whereIn('core_challenge_id', $ids);
}
}
Challenge::with('core_challenges')->active()->get();