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

时间:2017-01-23 10:16:29

标签: php laravel laravel-5 laravel-eloquent

我使用的是Laravel 5.3。删除主页时删除所有嵌套页面有简单的方法吗?

例如在我的表中:

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

它给出了这样的结构:

example name 1

当我删除id = 58({{1}})时,嵌套页面也应该重新删除。如何在PHP循环或Laravel 5中的其他方式做?

3 个答案:

答案 0 :(得分:2)

您也可以在模型的启动功能中处理它;

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();
        });
    }
}

答案 1 :(得分:0)

您不需要任何循环。首先删除带有ID的文章,然后使用parent_id。

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

$article->delete();

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

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

答案 2 :(得分:-1)

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

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

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