Задать вопрос
@GrimJack

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

Есть таблица lookups.
В ней хранятся записи структурированные по record_id
Структурировал так:
$lookups = (new Lookup)
            ->query()
            ->select([
                'lookup_id',
                'record_id',
                'lookup_list_id',
                'linked_record_id',
                'data',
                'element_label',
                'field_name',
                'sequence_order',
                'field_no',
                'archive'
            ])
            ->where('company_id', UserData::getDataUser()->company_id)
            ->where('lookup_list_id', $lookup_list_id)
            ->orderBy('sequence_order')
            ->get()
            ->groupBy(function($item, $key) {
                return $item->record_id;
            });

Все работает и достаточно быстро и выглядит примерно так:
h_1502452222_9896540_2627e323af.png
Где 13964 это record_id, а внутри все элементы с таким record_id
Теперь есть записи у которых есть связь в виде linked_record_id
У 13964 это 13897
То есть внутри 13964 должен появиться массив с объектами внутри. Объекты это записи с record_id = 13897
Как правильно построить запрос?
Сейчас при ~900 записях в таблице такой запрос выполняется около 1-2 минут
$lookups = (new Lookup)
            ->query()
            ->select([
                'lookup_id',
                'record_id',
                'lookup_list_id',
                'linked_record_id',
                'data',
                'element_label',
                'field_name',
                'sequence_order',
                'field_no',
                'archive'
            ])
            ->where('company_id', UserData::getDataUser()->company_id)
            ->where('lookup_list_id', $lookup_list_id)
            ->orderBy('sequence_order')
            ->get()
            ->groupBy(function($item, $key) {
                if($item->linked_record_id > 0)
                {
                    $link = (new Lookup)
                        ->query()
                        ->select([
                            'lookup_id',
                            'record_id',
                            'lookup_list_id',
                            'linked_record_id',
                            'data',
                            'element_label',
                            'field_name',
                            'sequence_order',
                            'field_no',
                            'archive'
                        ])
                        ->where('company_id', UserData::getDataUser()->company_id)
                        ->where('record_id', $item->linked_record_id)
                        ->orderBy('sequence_order')
                        ->get()->toArray();
                    $item->linked_data = $link;
                }
                    return $item->record_id;
            });

Ну и выполняется не совсем правильно, он вписывает данные внутрь каждого элемента, а не внутри 13964
Как правильно перестроить запрос? Второй день голову ломаю, ничего не приходит на ум(

UPD: Вот такой код выполняется 27секунд (вполне приемлемо для количества запросов) для 97 record_id + 1 запрос для каждого record_id
spoiler

$lookups = (new Lookup)
            ->query()
            ->select([
                'lookup_id',
                'record_id',
                'lookup_list_id',
                'linked_record_id',
                'data',
                'element_label',
                'field_name',
                'sequence_order',
                'field_no',
                'archive'
            ])
            ->where('company_id', UserData::getDataUser()->company_id)
            ->where('lookup_list_id', $lookup_list_id)
            ->orderBy('sequence_order')
            ->get()
            ->groupBy(function($item, $key) {
                /*if($item->linked_record_id > 0)
                {
                    $link = (new Lookup)
                        ->query()
                        ->select([
                            'lookup_id',
                            'record_id',
                            'lookup_list_id',
                            'linked_record_id',
                            'data',
                            'element_label',
                            'field_name',
                            'sequence_order',
                            'field_no',
                            'archive'
                        ])
                        ->where('company_id', UserData::getDataUser()->company_id)
                        ->where('record_id', $item->linked_record_id)
                        ->orderBy('sequence_order')
                        ->get()->toArray();
                    $item->linked_data = $link;
                }*/
                return $item->record_id;
            });
        $records = [];
        foreach ($lookups as $record_id => $node)
        {
            $record = [];
            foreach ($node as $lookup)
            {
                $record['data'] = $node;
                if($lookup->linked_record_id > 0)
                {
                    $link = (new Lookup)
                        ->query()
                        ->select([
                            'lookup_id',
                            'record_id',
                            'lookup_list_id',
                            'linked_record_id',
                            'data',
                            'element_label',
                            'field_name',
                            'sequence_order',
                            'field_no',
                            'archive'
                        ])
                        ->where('company_id', UserData::getDataUser()->company_id)
                        ->where('record_id', $lookup->linked_record_id)
                        ->orderBy('sequence_order')
                        ->get()->toArray();
                    $record['link_data'] = $link;
                    break;
                }
            }
            $records[$record_id] = $record;
        }


Но теперь смущает break в цикле. Как можно более корректно это организовать?
  • Вопрос задан
  • 487 просмотров
Подписаться 3 Комментировать
Подписчики вопроса 3 К ответам на вопрос (1)