Есть таблица 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;
});
Все работает и достаточно быстро и выглядит примерно так:

Где 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 в цикле. Как можно более корректно это организовать?