Рефакторинг, где нужно использовать через глобальные области действия в Laravel - PullRequest
0 голосов
/ 24 марта 2019

У меня есть 2 модели, CoreChallenge и Challenge.Ниже приведены отношения между таблицей.relation between tables

Я хочу получить Challenges с активным core_challenges.Я пытался поместить глобальную область в модель CoreChallenge, но когда я получаю null в отношениях, когда Corechallenge равен inactive.

Я сделал это таким образом

$challenges = Challenge::with('core_challenge')->whereHas('core_challenge', function($q){
            $q->where('status', '=', 'active');
        })->get();

Я хочу сделать это, используя глобальные области действия

Глобальная область действия на CoreChallenge дает мне значение NULL, но я хочу, чтобы его родитель (Challenge) не загружался даже, как в whereHas,Там в любом случае?

1 Ответ

0 голосов
/ 24 марта 2019

Я наткнулся на тот же подход, но когда таблица стала больше (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();
...