0

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

例如在我的表中:

+-----------------------------+
|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 1id = 58)嵌套页面也应该被删除。如何在 php 循环或 Laravel 5 中以其他方式执行?

4

3 回答 3

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();
        });
    }
}
于 2017-01-23T10:42:15.363 回答
0

你不需要任何循环。只需先删除带有 ID 的文章,然后删除带有 parent_id 的文章。

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

$article->delete();

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

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

于 2017-01-23T10:23:45.400 回答
-1

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

或者

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

Page::destroy([10, 22, 23, 40 , 55]);
于 2017-01-23T10:25:12.347 回答