@Nubbin

Как упростить запрос laravel?

$items = DataRelationship::where('link_id', $link->id)->get()->filter(function($user) {
                return (isset($user->user));
            })->sortByDesc(function($item) {
                return $item->club->where('status', 1)->count();
            })->take(10)

Этот запрос показывает данные и сортирует по большим количествам.
В базе 75 000 данных и это занимает чуть ли не 5 минут. Как можно упросить этот вариант чтобы она быстрее подгружало их
  • Вопрос задан
  • 275 просмотров
Пригласить эксперта
Ответы на вопрос 3
Sanasol
@Sanasol Куратор тега Laravel
нельзя просто так взять и загуглить ошибку
Потому что надо делать одним запросом нормально.

А у вас выбирается вообще всё что только возможно ->get()
А потом начинаются фильтры и еще подзапросы как минимум по одному на каждую строку которая нашлась в базе изначально по одному. Т.е. 75 000 запросов на выходе, а может даже в 2 раза больше с учетом первого фильтра.

Читайте доку по with(), orderBy() и наверно leftJoin() и делайте один нормальный запрос.
Ответ написан
@Koteezy
DataRelationship::select(['id', 'name', etc...])->whereLinkId($link->id)->whereHas('user')
            ->addSelect(
                DB::raw( '(select count(id) from clubs where data_relationships.id = clubs.data_relationship_id) as clubs_count' )
            )->orderBy('clubs_count', 'desc')->get();


Как-то так. В DB::raw поменяйте на свой sql, я не знаю какие у вас таблицы, и ключи.
Ответ написан
@Yan-s
Напишите сперва чистый запрос SQL и выполните его напрямую, а не из PHP. Вот когда он у вас будет и будет выполнятся за устраивающее вас время и вернет именно то, что вам надо, тогда подумаем как его в ORM засунуть.

А так.. пустое занятие в вашем случае.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы