Как только вы вызовете get()
, all()
, find()
или first()
в построителе запросов, вы попросите механизм Eloquent выполнить запрос и вернуть вам результат.Так что в вашем случае вся сортировка и группировка выполняются в памяти, что приводит к невероятно плохой производительности.
Что вы можете сделать, это улучшить ваш запрос:
User::query()
->where('type', 0)
->withCount('scores as topics')
->withCount(['scores as timing' => function ($query) {
$query->selectRaw('SUM(timer)'); // might look weird, but works...
}])
->orderBy('topics', 'desc')
->orderBy('timing', 'desc')
->get()
Для строкиномер (или звание, или как вы хотите позвонить), вы можете искать среди существующих вопросов и ответов.Если честно, ответ на этот вопрос был бы слишком большим для этого ответа.Очевидно, что вы не должны использовать свой подход, поскольку он также будет вычислять номер строки в памяти.
Но, очевидно, также важно, что вы делаете с результатами запроса.Вы отображаете миллион строк для пользователя?Если это так, то узким местом наверняка станет браузер.Возможно, вы захотите использовать нумерацию страниц с paginate()
вместо get()
.