更改laravel集合内的嵌套集合

时间:2020-05-09 22:44:55

标签: laravel collections eloquent nested overwrite

当尝试在嵌套在另一个集合内的一个集合上运行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;
            });

您能帮我理解为什么我必须取消设置对象的属性才能覆盖它吗?

0 个答案:

没有答案