我正在努力想出一种方法来查询这个问题。我有一个模型,显示资源及其子项,并且子项来自同一个表本身,这意味着资源树是无限嵌套的。关系如下
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,因为它不是它下面的子级。
对于那些可能想做类似事情的人。这是我解决问题的方法。
样本数据👇👇
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: