【问题标题】:How can show unlimited parent-child & sub-child tree data in laravel如何在laravel中显示无限的父子和子树数据
【发布时间】:2021-08-06 17:35:11
【问题描述】:

我有像父子这样的数据,在数据库中具有无限级别的子子和子子数据,您可以在下面看到它就像一棵二叉树,其中的节点有多个子节点,这些子节点可以有无限的子子节点。

请给我一个解决方案或建议如何证明这一点。谢谢。

这是我从数据库中获取的数据库 JSON 数据...

控制器代码

$products = Product::where('project_id', $project_id )->whereNull('parent_id')->with('categories')->with('childProducts')->get();
"data": {
    "products": [
        {
            "id": 1,
            "name": "ParentProduct",
            "project_id": 1,
            "parent_id": null,
            "created_by": 1,
            "created_at": "2021-08-05 10:18:35",
            "updated_at": "2021-08-05 10:18:35",
            "categories": [
                {
                    "id": 6,
                    "product_id": 1,
                    "project_id": 1,
                    "name": "TopLevelCategory",
                    "created_at": "2021-08-05 10:18:35",
                    "updated_at": "2021-08-05 10:18:35",
                }
            ],
            "child_products": [
                {
                    "id": 2,
                    "name": "LevelOneProduct",
                    "project_id": null,
                    "parent_id": 1,
                    "created_by": null,
                    "created_at": "2021-08-05 10:18:35",
                    "updated_at": "2021-08-05 10:18:35",
                    "categories": [
                        {
                            "id": 1,
                            "product_id": 2,
                            "project_id": 1,
                            "name": "LevelOneProductCategory",
                            "created_at": "2021-08-05 10:18:35",
                            "updated_at": "2021-08-05 10:18:35",
                        }
                    ],
                    "child_products": [
                        {
                            "id": 3,
                            "name": "LevelOneProductChildFolder",
                            "project_id": null,
                            "parent_id": 2,
                            "created_by": null,
                            "created_at": "2021-08-05 10:18:35",
                            "updated_at": "2021-08-05 10:18:35",
                            "categories": [
                                {
                                    "id": 2,
                                    "product_id": 3,
                                    "project_id": 1,
                                    "name": "evelOneProductChildFolderCategory",
                                    "created_at": "2021-08-05 10:18:35",
                                    "updated_at": "2021-08-05 10:18:35",
                                }
                            ],
                            "child_products": [
                                {
                                    "id": 4,
                                    "name": "LevelOneProductSubChildFolder",
                                    "project_id": null,
                                    "parent_id": 3,
                                    "created_by": null,
                                    "created_at": "2021-08-05 10:18:35",
                                    "updated_at": "2021-08-05 10:18:35",
                                    "categories": [
                                        {
                                            "id": 3,
                                            "product_id": 4,
                                            "project_id": 1,
                                            "name": "LevelOneProductSubChildFolderCategory",
                                            "created_at": "2021-08-05 10:18:35",
                                            "updated_at": "2021-08-05 10:18:35",                                            
                                        }
                                    ],
                                    "child_products": []
                                }
                            ]
                        }
                    ]
                },
                {
                    "id": 5,
                    "name": "LeveTwoProduct",
                    "project_id": null,
                    "parent_id": 1,
                    "created_by": null,
                    "created_at": "2021-08-05 10:18:35",
                    "updated_at": "2021-08-05 10:18:35",
                    "categories": [],
                    "child_products": [
                        {
                            "id": 6,
                            "name": "LeveTwoProductFolder",
                            "project_id": null,
                            "parent_id": 5,
                            "created_by": null,
                            "created_at": "2021-08-05 10:18:35",
                            "updated_at": "2021-08-05 10:18:35",
                            "categories": [
                                {
                                    "id": 4,
                                    "product_id": 6,
                                    "project_id": 1,
                                    "name": "LeveTwoProductFolderCategory",
                                    "created_at": "2021-08-05 10:18:35",
                                    "updated_at": "2021-08-05 10:18:35",
                                }
                            ],
                            "child_products": [
                                {
                                    "id": 7,
                                    "name": "LeveTwoProductChildFolder",
                                    "project_id": null,
                                    "parent_id": 6,
                                    "created_by": null,
                                    "created_at": "2021-08-05 10:18:35",
                                    "updated_at": "2021-08-05 10:18:35",
                                    "categories": [
                                        {
                                            "id": 5,
                                            "product_id": 7,
                                            "project_id": 1,
                                            "name": "LeveTwoProductChildFolderCategory",
                                            "created_at": "2021-08-05 10:18:35",
                                            "updated_at": "2021-08-05 10:18:35",
                                        }
                                    ],
                                    "child_products": []
                                }
                            ]
                        }
                    ]
                }
            ]
        }
    ]
},

编辑:我想把上面的数据和这个数据相等

foreach ($product->categories as $singleCaegory) {                       
    $singleCaegoryData = [
        "name" => $singleCaegory->name, 
        "request" => [ 
            'method' =>  $singleCaegory->type,
            'body' => [
                "mode" => "raw",
                'raw' => $singleCaegory->raw_data,
                "options" => [
                    "raw" => [
                        "language" => "json"
                    ],
                ],
            ],
            'url' =>  [
                "raw" =>  $singleCaegory->url,
                "host" => [
                    $singleCaegory->url
                ]
            ], 
        ],
    ]; 
}

【问题讨论】:

    标签: php mysql laravel


    【解决方案1】:

    您需要在一个查询中获取所有产品,然后对其进行处理以构建树。您不能以传统方式急切地加载它。 Original solution from Formatink

    public function products($projectId)
    {
        $products= Product::where('project_id', $projectId)->get();
        $products_by_id = collect();
    
        foreach ($products as $product) {
            $products_by_id->put($product->id, $product);
        }
    
        foreach ($products as $key => $product) {
            $products_by_id->get($product->id)->children = new Collection;
            if ($product->parent_id != 0) {
                $products_by_id->get($product->parent_id)->children->push($product);
                unset($products[$key]);
            }
        }
    
        return $products;
    }
    

    【讨论】:

    • 谢谢,亲爱的@n69s 回复我。我想像二叉树遍历一样执行此操作,因为我正在急切地加载这些数据。基本上,我想通过从父子数据库中获取这些数据来制作 JSON 数据。
    • @Spiral 这正是我在这里提出的。我不明白你在说什么。
    • 基本上,我想制作一个我从数据库中获取并需要将其导入网站的所有这些的 JSON 数据文件。这样我就可以根据他们需要的 JSON 数据文件来做这个。谢谢
    • @Spiral 所以你的问题是关于响应的格式获得所有子产品的难度?
    • 亲爱的,我希望所有这些 JSON 数据都等于将生成 JSON 文件的硬编码属性。比如让我更新问题
    猜你喜欢
    • 2015-01-20
    • 2011-02-20
    • 1970-01-01
    • 2015-06-14
    • 1970-01-01
    • 1970-01-01
    • 2020-01-21
    • 1970-01-01
    • 2021-07-21
    相关资源
    最近更新 更多