Laravel - Как объединить две коллекции и отсортировать по столбцу? - PullRequest
0 голосов
/ 02 ноября 2018

У меня есть три таблицы: команды, файлы и папки. Каждый из них выглядит следующим образом.

Команда

  • ID
  • название

Файлы

  • ID
  • team_id
  • folder_id
  • название
  • путь
  • заказ

Папка

  • 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);
}

Хотя это работает, такое чувство, что это можно сделать лучше. Это кажется неэффективным и немного странным, что порядок хранится как в таблице файлов, так и в папках. У кого-нибудь есть предложения? Я не против реструктуризации моей базы данных, если мне это нужно. Может быть, полиморфные отношения, где есть команды, предметы, группы и файлы? Тогда таблица Предметов может хранить либо группу, либо файл?

...