У меня есть три таблицы: команды, файлы и папки. Каждый из них выглядит следующим образом.
Команда
Файлы
- ID
- team_id
- folder_id
- название
- путь
- заказ
Папка
Я пытаюсь загрузить все файлы и папки одновременно и упорядочить их по столбцу «Порядок». Если в папке есть какие-либо файлы, я также хотел бы, чтобы она захватила первые 3 файла. Я не могу понять, как сделать это эффективно. Самое близкое, что я пришел, это следующее:
public function index(Team $team)
{
$files = $team->files()->where('folder_id', null)->get();
$folders = $team->folders()->get();
$folders->load(['files'=> function($query) {
$query->take(3)->orderBy('order');
}]);
$files = array_merge($files->toArray(), $folders->toArray());
usort($files, function($a, $b){
if ($a['order'] == $b['order']) {
return 0;
}
return ($a['order'] < $b['order']) ? -1 : 1;
});
return response(['files' => $files], 200);
}
Хотя это работает, такое чувство, что это можно сделать лучше. Это кажется неэффективным и немного странным, что порядок хранится как в таблице файлов, так и в папках. У кого-нибудь есть предложения? Я не против реструктуризации моей базы данных, если мне это нужно. Может быть, полиморфные отношения, где есть команды, предметы, группы и файлы? Тогда таблица Предметов может хранить либо группу, либо файл?