Я использую 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 1
(id = 58
) вложенные страницы также должны быть удалены. Как это сделать в php loop или по-другому в Laravel 5?
Вы также можете справиться с этим в функции загрузки модели;
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();
});
}
}
Вам не нужна петля. Просто сначала удалите статью с идентификатором, затем с parent_id.
$article=Article::findOrFail($id);
$article->delete();
Article::where('parent_id', $id)->delete();
Также вы можете использовать softDelete()
метод, если вы хотите восстановить удаленные статьи в любое время.
Вы должны использовать OnDelete ( ‘Каскад’) метод миграции базы данных, если это возможно.
Или же
Вы можете написать функцию, которая будет принимать page_id, который вы хотите удалить. Вызывайте эту функцию рекурсивно, пока не получите все дочерние элементы каждого уровня этой страницы и не вернете их. И, наконец, массовое удаление их в одном запросе, например:
Page::destroy([10, 22, 23, 40 , 55]);