删除页面和所有连接到主页面的嵌套页面

Deleting page and all nested pages connected to main

我正在使用 Laravel 5.3。删除主页面时,有什么简单的方法可以删除所有嵌套页面吗?

例如在我的 table:

+-----------------------------+
|id|parent|name               |
+--+------+-------------------+
|67|0     |example name 1     |
+--+------+-------------------+
|68|67    |example name 2     |
+--+------+-------------------+
|58|68    |example name 3     |
+--+------+-------------------+
|65|58    |example name 4     |
+--+------+-------------------+
|70|68    |example name 5     |
+--+------+-------------------+
|66|0     |example name 6     |
+--+------+-------------------+

它给出了这样的结构:

example name 1
       |
       +---------example name 2
               |
               +---------example name 3
                      |
                      +---------example name 4
               |
               +---------example name 5  
example name 6

当我删除 example name 1 (id = 58) 嵌套页面时,也应该删除。如何在 php 循环或 Laravel 5 中以其他方式执行?

您不需要任何循环。只需先删除ID为parent_id的文章即可。

$article=Article::findOrFail($id);

$article->delete();

Article::where('parent_id', $id)->delete();

此外,如果您想随时恢复已删除的文章,可以使用softDelete()方法。

如果可能,您应该利用 onDelete('cascade') 方法进行数据库迁移。

您可以编写一个函数来接受要删除的 page_id。递归调用该函数,直到您获得该页面每个级别的所有子项和 return 它们。最后在单个查询中批量删除它们,例如:

Page::destroy([10, 22, 23, 40 , 55]);

您也可以在模型的启动函数中处理它;

protected static function boot() {
    parent::boot();

    App\Page::deleted(function($page) {
         App\Page::where('parent_id', $page->id)->delete();
    }); 
}

这将递归处理嵌套删除问题。但是,对于可能嵌套很深或有多个关系的页面,这可能是一个性能问题,您可能需要改用队列。

例子

在你的模型文件中,App\Page你添加了这个函数:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Page extends Model {
    public static function boot() {
        parent::boot();

        static::deleted(function($page){
             static::where('parent_id', $page->id)->delete();
        });
    }
}