按created_at和文件关系分组收集

时间:2019-04-23 09:50:37

标签: laravel

我有这种关系:

每个用户都有一个图库,而每个画廊都有很多文件。

两个用户可以拥有一个相同日期的画廊。

这是输出JSON响应:

User1 {
 galleries: {
  created_at: 23.04.2019.
  files: [
    {
     path: "path/to/file.jpg"
    },
    {
     path: "path/to/file2.jpg"
    },
  ]
 }
},
User2 {
 galleries: {
  created_at: 23.04.2019.
  files: [
    {
     path: "path/to/file3.jpg"
    },
    {
     path: "path/to/file4.jpg"
    },
  ]
 }
}

我需要以某种方式通过created_at值对画廊进行分组,但对于分组的画廊对象,要将所有文件保持在相同的JSON响应中。像这样:

Users {
 galleries: {
  created_at: 23.04.2019.
  files: [
    {
     path: "path/to/file.jpg"
    },
    {
     path: "path/to/file2.jpg"
    },
    {
     path: "path/to/file3.jpg"
    },
    {
     path: "path/to/file4.jpg"
    },
  ]
 }
},

我尝试使用->groupBy('galleries.created_at'),但是我得到了-第一个图库中的第一个文件,第二个画廊中的第一个文件

Users {
 galleries: {
  created_at: 23.04.2019.
  files: [
    {
     path: "path/to/file.jpg"
    },
    {
     path: "path/to/file3.jpg"
    },
  ]
 }
},

1 个答案:

答案 0 :(得分:0)

在将数据传递到分形变压器之前,需要获取正确的数据。 您期望的输出似乎是一个File日期所组织的Gallery的列表。它实际上与Users没有任何关系(除非您计划以后对返回的数据进行范围划分)。话虽如此,雄辩的关系在这里并没有真正的帮助,因为我们不处理单个模型的关系,我们可以使用Laravel查询构建器并使用groupBy集合帮助器函数来组织结果。 / p>

由您决定在哪里放置此方法;可以很容易地将其引入控制器方法中,但是如果您打算对结果进行范围界定(例如,对某些User,或某些日期,如下所示),则可以将其包含在模型中。

// Gallery.php

public static function filesByGalleryDate($date = null) {
    $query = DB::table('gallery')
        ->leftJoin('files', 'galleries.id', '=', 'files.gallery_id')
        ->select('galleries.created_at', 'files.*')
        ->orderBy('galleries.created_at');

    $result = $date == null 
        ? $query->get()
        : $query->where('galleries.created_at', $date)->get();

    return $result->groupBy('created_at')

        // for each date, convert inner stdClasses to arrays
        ->map(function($date) { 
            return $date->map(function($file) { 
                return (array) $file; 
            }); 
        });
}