2017-01-23 17 views
0

私はLaravel 5.3を使用しています。メインページを削除すると、すべてのネストされたページを簡単に削除できますか?私のテーブル内の例えばページとメインに接続されたすべてのネストされたページを削除

:私はexample name 1id = 58)ネストされたページがあまりにもremoovedする必要があります削除すると

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

+-----------------------------+ 
|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  | 
+--+------+-------------------+ 

それは、このような構造を提供します。どのように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(); 
     }); 
    } 
} 
+0

これは今のところそれを処理するための最良の方法です。 +1 –

+0

私はどのように私たちにboot()関数と親:__bootについてはわかりません。説明していただけますか? – Tomasz

+0

@Tomaszこれはあなたの 'App \ Page'モデルに入ります。 'boot()'関数は、Eloquentの 'model'が実装するメソッドです。独自のブートメソッドを宣言していますが、Eloquentの基本メソッドを 'parent :: boot(); 'と呼びます。 – Ohgodwhy

0

ループは必要ありません。最初にIDのある記事を削除してから、parent_idを付けて記事を削除してください。あなたはいつでも削除した記事を復元したい場合は

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

$article->delete(); 

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

また、あなたは、softDelete()メソッドを使用することができます。

+0

問題は、正しく理解していれば、ネストレベルがわからないということです。 –

+0

彼はparent_idを使用しています。 1つの記事のすべての入れ子レベルを見つけることができます。 – Rashad

+0

exに対して「example name 1」を削除すると、 'example name 3'(parent id = 2)で動作しません。 'example name 2'(親id = 1)を削除するだけです –

-1

可能であれば、onDelete( 'cascade')データベースの移行方法を利用する必要があります。

それとも

あなたが削除したいpage_idのを受け入れる関数を書くことができます。そのページの各レベルのすべての子を取得して返すまで、その関数を再帰的に呼び出します。最後に、次のような単一のクエリでそれらを一括削除します。

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

この解決策は良いと思います。私はそれを確認します。 – Tomasz

関連する問題