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。