【发布时间】: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(); -
是的,这应该是下一步,但我想以递归方式运行此查询。我想删除链接到主节点的所有节点。