【问题标题】:Remove categories with all childs derived from parent category删除所有从父类别派生的子类别的类别
【发布时间】:2020-02-01 17:01:01
【问题描述】:

我想从父类别中删除所有相关的子类别。我想我需要一个递归函数来解决这个问题。这是我的尝试:

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     |
+-------------+----------+-----------+

我的期望:

如果我删除了主类别,则必须删除子类别和子 2 类别。

我怎样才能用 eloquent 做到这一点?

答案还可以,但没有按我的预期工作。我想删除所有子类别及其衍生品。给出的例子只找到第一个节点。

解决方案

我通过迁移解决了这个问题。

我为 PARENT_ID 创建了一个 FOREIGN KEY,它引用了迁移文件中的类别 ID。当我执行删除操作时,它会使用子节点自行删除(如果其子节点有子节点,它也可以工作)。

这是我使用的迁移代码:

$table->foreign('parent_id')->references('id')->on('categories')->onDelete('cascade'); 那么

App\Categories::find($id)->delete();与子节点一起删除。

【问题讨论】:

  • Categories::where("parent_id", $this->id)->delete();
  • 是的,这应该是下一步,但我想以递归方式运行此查询。我想删除链接到主节点的所有节点。

标签: php laravel eloquent


【解决方案1】:

您还需要检查子类别的子条目。你会有更深的数据吗?

如果你重复更好

foreach ($categories as $category) {

inside 也与子类别一起查找子类别是否存在。

【讨论】:

  • 感谢您的建议,但我不知道如何将其作为递归函数执行。
  • 在第一个 foreach 中选择要删除的行。运行另一个 foreach 以根据先前的选择(parent_id 匹配 id)进行选择,并在第二个 foreach 中删除。在退出第二个 foreach 时,最终删除父级并退出第一个 foreach。
【解决方案2】:

我通过迁移解决了这个问题。

我为 PARENT_ID 创建了一个 FOREIGN KEY,它引用了迁移文件中的类别 ID。当我执行删除操作时,它会使用子节点自行删除(如果其子节点有子节点,它也可以工作)。

这是我使用的迁移代码:

$table->foreign('parent_id')->references('id')->on('categories')->onDelete('cascade');

然后

App\Categories::find($id)->delete(); 与子节点一起删除。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-11
    • 1970-01-01
    • 2011-11-05
    • 1970-01-01
    • 2011-07-30
    • 2017-05-14
    • 1970-01-01
    • 2015-09-18
    相关资源
    最近更新 更多