我有这种关系:
每个用户都有一个图库,而每个画廊都有很多文件。
两个用户可以拥有一个相同日期的画廊。
这是输出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"
},
]
}
},
答案 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;
});
});
}