如何检查记录是否存在于无限嵌套子关系中

问题描述 投票:0回答:1

我正在努力想出一种方法来查询这个问题。我有一个模型,显示资源及其子项,并且子项来自同一个表本身,这意味着资源树是无限嵌套的。关系如下

class UserDrive extends Model
{
    public function children(): \Illuminate\Database\Eloquent\Relations\HasMany
    {
        return $this->hasMany(self::class, 'folder_id','id')->with('children');
    }
}

我的控制器调用它如下所示



    public function getFolder($folder_id)
    {
        return new UserDriveCollection(UserDrive::with("children")->where('user_id', $this->user)->where('id', $folder_id)->paginate($this->paginatePerPage(), ['*'], 'page', 1));
    }

资源如下所示

public function toArray($request)
    {

            return [
                "id" => $this->id,
                "folder_name" => $this->folder_name,
                "children" => self::collection($this->whenLoaded('children'))
            ];

    }

结果采用以下格式

[
            {
                "id": 1,
                "folder_name": "Setswana Material",
                "children": [
                    {
                        "id": 2,
                        "folder_name": "Love Materials",
                        "children": [
                            {
                                "id": 11,
                                "folder_name": "folder54",
                                "children": [
                                    {
                                        "id": 19,
                                        "folder_name": "folder1",
                                        "children": []
                                    },
                                    {
                                        "id": 20,
                                        "folder_name": "folder2",
                                        "children": []
                                    },
                                    {
                                        "id": 21,
                                        "folder_name": "folder",
                                        "children": []
                                    },
                                    {
                                        "id": 22,
                                        "folder_name": "folder3",
                                        "children": []
                                    },
                                    {
                                        "id": 23,
                                        "folder_name": "folder4",
                                        "children": []
                                    },
                                    {
                                        "id": 24,
                                        "folder_name": "folder5",
                                        "children": []
                                    }
                                ]
                            },
                            {
                                "id": 12,
                                "folder_name": "folder5",
                                "children": []
                            },
                            {
                                "id": 13,
                                "folder_name": "\nfolder5",
                                "children": []
                            },
                            {
                                "id": 14,
                                "folder_name": "folder",
                                "children": []
                            },
                            {
                                "id": 15,
                                "folder_name": "folder4",
                                "children": []
                            },
                            {
                                "id": 16,
                                "folder_name": "folder3",
                                "children": []
                            },
                            {
                                "id": 17,
                                "folder_name": "folder2",
                                "children": []
                            },
                            {
                                "id": 18,
                                "folder_name": "folder1",
                                "children": []
                            }
                        ]
                    },
                    {
                        "id": 6,
                        "folder_name": "folder1",
                        "children": []
                    },
                    {
                        "id": 7,
                        "folder_name": "folder2",
                        "children": []
                    },
                    {
                        "id": 8,
                        "folder_name": "folder3",
                        "children": []
                    },
                    {
                        "id": 9,
                        "folder_name": "folder4",
                        "children": []
                    },
                    {
                        "id": 10,
                        "folder_name": "folder5",
                        "children": []
                    }
                ]
            },
            {
                "id": 3,
                "folder_name": "folder2",
                "children": []
            },
            {
                "id": 4,
                "folder_name": "folder3",
                "children": []
            },
            {
                "id": 5,
                "folder_name": "folder4",
                "children": []
            }
        ]

所以我的问题是如何检查资源是否作为子项或子项的子项存在,甚至比这更深。关系/树数组是无限的,所以我想检查所有可能的子项。

所以,如果我想检查

id: 24
是否是
id: 1
的子级,那么上面的数据应该是正确的。如果我想检查
 id: 2
是否是
id: 1
的子级,如果也应该为 true,但如果我检查
id: 5
id: 1
的子级,它应该为 false,因为它不是它下面的子级。

php sql laravel eloquent children
1个回答
0
投票

对于那些可能想做类似事情的人。这是我解决问题的方法。

样本数据👇👇

 covert to php array

[
            {
                "id": 1,
                "folder_name": "Setswana Material",
                "children": [
                    {
                        "id": 2,
                        "folder_name": "Love Materials",
                        "children": [
                            {
                                "id": 11,
                                "folder_name": "folder54",
                                "children": [
                                    {
                                        "id": 19,
                                        "folder_name": "folder1",
                                        "children": []
                                    },
                                    {
                                        "id": 20,
                                        "folder_name": "folder2",
                                        "children": []
                                    },
                                    {
                                        "id": 21,
                                        "folder_name": "folder",
                                        "children": []
                                    },
                                    {
                                        "id": 22,
                                        "folder_name": "folder3",
                                        "children": []
                                    },
                                    {
                                        "id": 23,
                                        "folder_name": "folder4",
                                        "children": []
                                    },
                                    {
                                        "id": 24,
                                        "folder_name": "folder5",
                                        "children": []
                                    }
                                ]
                            },
                            {
                                "id": 12,
                                "folder_name": "folder5",
                                "children": []
                            },
                            {
                                "id": 13,
                                "folder_name": "\nfolder5",
                                "children": []
                            },
                            {
                                "id": 14,
                                "folder_name": "folder",
                                "children": []
                            },
                            {
                                "id": 15,
                                "folder_name": "folder4",
                                "children": []
                            },
                            {
                                "id": 16,
                                "folder_name": "folder3",
                                "children": []
                            },
                            {
                                "id": 17,
                                "folder_name": "folder2",
                                "children": []
                            },
                            {
                                "id": 18,
                                "folder_name": "folder1",
                                "children": []
                            }
                        ]
                    },
                    {
                        "id": 6,
                        "folder_name": "folder1",
                        "children": []
                    },
                    {
                        "id": 7,
                        "folder_name": "folder2",
                        "children": []
                    },
                    {
                        "id": 8,
                        "folder_name": "folder3",
                        "children": []
                    },
                    {
                        "id": 9,
                        "folder_name": "folder4",
                        "children": []
                    },
                    {
                        "id": 10,
                        "folder_name": "folder5",
                        "children": []
                    }
                ]
            },
            {
                "id": 3,
                "folder_name": "folder2",
                "children": []
            },
            {
                "id": 4,
                "folder_name": "folder3",
                "children": []
            },
            {
                "id": 5,
                "folder_name": "folder4",
                "children": []
            }
        ]

以及从代码中获取id的代码

        return $resource->pipe(function ($collection) {
            $array = $collection->toArray();
            $ids = [];
            array_walk_recursive($array, function ($value, $key) use (&$ids) {
                if ($key === 'id') {
                    $ids[] = $value;
                };
            });
            return $ids;
        });

他们的结果采用以下格式

        [
            2,11,19,20,21,22,23,24,12,13,14,15,16,17,18
        ]

它从多维数组中获取所有

id:
字段,并且我测试了最多8步的深度,它能够获取所有
id:

© www.soinside.com 2019 - 2024. All rights reserved.