我使用的是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中的其他方式做?
答案 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]);