删除页面和所有连接到主页面的嵌套页面
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();
});
}
}
我正在使用 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();
});
}
}