Laravel-如何合并两个集合并按列排序?

时间:2018-11-02 01:19:51

标签: database laravel eloquent relational-database

我有三个表:团队,文件和文件夹。每个看起来如下。

团队

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

尽管这可行,但感觉可以做得更好。将顺序存储在“文件”和“文件夹”表中,感觉效率低下,而且有点怪异。有没有人有什么建议?如果需要,我不反对重组数据库。也许存在团队,项目,组和文件的多态关系?那么Items表可以存储组还是文件?

0 个答案:

没有答案