我有三个表:团队,文件和文件夹。每个看起来如下。
团队
文件
文件夹
我正在尝试一次加载所有文件和文件夹,并通过“订单”列对其进行排序。如果一个文件夹中有任何文件,我也希望它抓取前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);
}
尽管这可行,但感觉可以做得更好。将顺序存储在“文件”和“文件夹”表中,感觉效率低下,而且有点怪异。有没有人有什么建议?如果需要,我不反对重组数据库。也许存在团队,项目,组和文件的多态关系?那么Items表可以存储组还是文件?