当尝试在嵌套在另一个集合内的一个集合上运行groupBy()方法时,我遇到了这种“奇怪”的行为。
以下是一些示例数据:
$data = [ //This is an Eloquent collection
{
"id": 1,
"various fields": xx,
"nested_collection":
[
{
"id": 1,
"various fields": xx,
"object": {
"id": 1,
"prop_1": "value1",
"prop_2": null,
}
},
{
"id": 2,
"various fields": xx,
"object": {
"id": 2,
"prop_1": "value2",
"prop_2": null,
}
},
{
"id": 3,
"various fields": xx,
"object": {
"id": 2,
"prop_1": "value2",
"prop_2": null,
}
},
]
},
{
"id": 2,
"various fields": xx,
"nested_collection":
[
{
"id": 4,
"various fields": xx,
"object": {
"id": 3,
"prop_1": "value2",
"prop_2": null,
}
},
{
"id": 5,
"various fields": xx,
"object": {
"id": 4,
"prop_1": "value1",
"prop_2": null,
}
},
]
}
]
所以,我要实现的目标是让每个nested_collection按object-> prop_1值分组。
[
{
"id": 1,
"various fields": xx,
"nested_collection": {
"value1": [
{
"id": 1,
"various fields": xx,
"object": {
"id": 1,
"prop_1": "value1",
"prop_2": null,
}
}]
"value2": [
{
"id": 2,
"various fields": xx,
"object": {
"id": 2,
"prop_1": "value2",
"prop_2": null,
}
},
{
"id": 3,
"various fields": xx,
"object": {
"id": 2,
"prop_1": "value2",
"prop_2": null,
}
},
]}
},
{
"id": 2,
"various fields": xx,
"nested_collection": {
"value2": [
{
"id": 4,
"various fields": xx,
"object": {
"id": 3,
"prop_1": "value2",
"prop_2": null,
}
},
{
"id": 5,
"various fields": xx,
"object": {
"id": 4,
"prop_1": "value2",
"prop_2": null,
}
},
]
}
}
]
我尝试了许多不同的变化。 我认为更有意义的是以下两个:
$groupedData = $data->each(function ($item) {
$item->nested_collection->groupBy('object.prop_1');
});
或
$groupedData = $data->map(function ($item) {
$item->nested_collection = $item->nested_collection->groupBy('object.prop_1');
return $item;
});
但是$ groupedData与$ data完全一样。
我什至试图只返回nested_collection来查看groupBy是否正在工作,的确如此,但是当然我$ item中的所有其他字段都丢失了:
$groupedData = $data->map(function ($item) {
return $item->nested_collection->groupBy('object.prop_1');
});
唯一可行的方法是:
$groupedData = $data->map(function ($item) {
$tmp = $item->nested_collection->groupBy('object.prop_1');
unset($item['nested_collection']);
$item->nested_collection = $tmp;
return $item;
});
您能帮我理解为什么我必须取消设置对象的属性才能覆盖它吗?