Чтобы добавить к тому, что упомянул Роб. Настройка точек останова в вашем приложении позволяет поэтапно обрабатывать стек. Это позволяет разработчику использовать отладчик, чтобы увидеть, в какой точной точке метод делает что-то непредвиденное.
Так как Rob использовал NullPointerException
(NPE), чтобы проиллюстрировать что-то общее, мы можем помочь удалите эту проблему следующим образом:
, если у нас есть метод, который принимает такие параметры, как: void (String firstName)
. В нашем коде мы хотели бы оценить, что firstName
содержит значение, мы сделали бы это так: if(firstName == null || firstName.equals("")) return;
Вышеупомянутое не позволяет нам использовать firstName
как небезопасный параметр. Поэтому, выполняя нулевые проверки перед обработкой, мы можем помочь обеспечить правильность работы нашего кода. Чтобы расширить пример, который использует объект с помощью методов, мы можем посмотреть здесь:
if(dog == null || dog.firstName == null) return;
Выше был правильный порядок проверки нулей, мы начинаем с базового объекта , собака в этом случае, а затем начните спускаться по дереву возможностей, чтобы убедиться, что все будет действовать до обработки. Если бы порядок был отменен, NPE потенциально может быть выброшен, и наша программа потерпит крах.
Я наткнулся на тот же подход, но когда таблица стала больше (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();