Php 删除所有子类别都派生自父类别的类别
我想从父类别中删除所有相关的子类别。我想我需要一个递归函数来解决这个问题。以下是我的尝试:Php 删除所有子类别都派生自父类别的类别,php,laravel,eloquent,Php,Laravel,Eloquent,我想从父类别中删除所有相关的子类别。我想我需要一个递归函数来解决这个问题。以下是我的尝试: public function destroy(Request $request) { $categories = \App\Categories::select('parent_id')->whereNotNull('parent_id')->get(); foreach ($categories as $category) { if ($category-&
public function destroy(Request $request)
{
$categories = \App\Categories::select('parent_id')->whereNotNull('parent_id')->get();
foreach ($categories as $category) {
if ($category->parent_id == $request->cid) {
$childCategories = \App\Categories::select('parent_id')->where('parent_id', $category->parent_id)->get();
}
}
}
我的桌子是这样的
+-------------+----------+-----------+
| id | name | parent_id |
+-------------+----------+-----------+
| 1 | MAIN | NULL |
+-------------+----------+-----------+
| 2 | CHILD | 1 |
+-------------+----------+-----------+
| 3 | CHILD 2 | 2 |
+-------------+----------+-----------+
我的期望:
如果我删除了主类别,则必须删除child和child 2类别。
我怎样才能用雄辩的口才来表演呢
答案是可以的,但它没有像我预期的那样起作用。我想删除所有的子类别及其派生。给出的例子是只找到第一个节点
解决方案
我通过迁移解决了这个问题 我为PARENT_ID创建了一个外键,它引用迁移文件中类别的ID。当我执行删除操作时,它会将自身与子节点一起删除(如果其子节点具有子节点,它也会工作) 以下是我使用的迁移代码:
$table->foreign('parent_id')->references('id')->on('categories')->onDelete('cascade');
$table->foreign('parent_id')->references('id')->on('categories')->onDelete('cascade');
然后
App\Categories::find($id)->delete();与子节点一起删除。您还需要检查子类别的子条目。你会有更深入的数据吗 如果你重复的话会更好
foreach ($categories as $category) {
内部也包含子类别,以查找内部是否存在子类别。我通过迁移修复了此问题 我为PARENT_ID创建了一个外键,它引用迁移文件中类别的ID。当我执行删除操作时,它会将自身与子节点一起删除(如果其子节点具有子节点,它也会工作) 以下是我使用的迁移代码:
$table->foreign('parent_id')->references('id')->on('categories')->onDelete('cascade');
然后
App\Categories::find($id)->delete()代码>与子节点一起删除。类别::其中(“父节点id”,$this->id)->delete()代码>是,这应该是下一步,但我希望以递归方式运行此查询。我想删除链接到主节点的所有节点。感谢您的建议,但我不知道如何将其作为递归函数执行。在first foreach中选择要删除的行。运行另一个foreach以基于上一个选择(父id匹配id)并在第二个foreach delete中进行选择。退出第二个foreach时,最终删除父项并退出第一个foreach。