2016-09-07 31 views
0

私はLaravelでアプリケーションを作成していますが、問題が発生しました。私はページを管理するための簡単なCRUDバックエンドを作成しています。MySQL - 同じテーブル(Laravel、ORM)を参照する外部キーによるレコードのレコード

id | title | parent_id 
----------------------------- 
1 | Homepage | 0 
2 | About | 0 
3 | Team  | 2 
4 | Mission | 2 
5 | Directors| 3 
6 | Contact | 0 

私のアプリケーションでは、親によってネストされたレコードを表示したいと考えています。ですから、これは次のようになります:

Homepage 
About 
- Team 
    - Directors 
- Mission 
Contact 

通常のアプリケーションでこれを行うことができます。しかし、私はEloquentモデルで動作するようにクエリ/メソッドを必要とし、その順序で並べ替えます。これらのチェックを個々のレコードごとに行うことができるので、ネストは必要ありませんが、上記のようにすべてのページを順番に返すクエリが必要です。

このコード、同じ親を持つグループが正しくページながら、私も正しい場所にそれらを置くために、クエリを必要とし、単に親ページの下にそれを注文:助けを

Page::orderBy('parent_id')->get(); 

感謝を!

+0

レベルを持つことができますどのように多くの? –

+0

これは任意の数のレベルを持つことができます(実際には実用的なアプリケーションでは3〜4までしか現実的ではありませんが、いくつかのレベルでハードコーディングされない再帰的なソリューションが欲しい) – Giedrius

答えて

1

まず、定義モデルでは、次のような関係になります。

public function children() 
{ 
    return $this->hasMany('App\Page', 'parent_id', 'id'); 
} 

次の子供たちに次のように、あなたは最初のレベルのアイテムを取得することができます

Page::with('children.children.children')->where('parent_id', 0)->get(); 
+0

それは私を近づけるようです。今では、すべてのページインスタンスとその中でアクセス可能な「子」を取得します。しかし、私はこれをモジュールに渡す必要があります。モジュールでは、レコードのコレクションを受け取り、テーブルに表示します。この結果を変換して、子ページが親ページのプロパティではなく、コレクションの親ページと同じレベルにあり、今の順番に並べられるようにするにはどうすればよいですか? – Giedrius

+0

@Giedrius "子ページは親ページのプロパティではありません"とはどういう意味ですか? –

+0

申し訳ありませんが私の考えを適切な文章に入れにくいです。この回答で、 '$ pages'変数はこのようなものです。{{title: 'About'、子供:{{title: 'Team'} ...}、{title: 'Contact}'、すべてのページをトップレベルにするためにコレクションを必要とするので、 '{{title: 'About'}、{title: 'Team'} ...、{title: 'Contact'}]'ネストされたコレクション内での順序と同じです。分かりますか? – Giedrius

0

なぜ関係を定義していない:

public function children(){ 
    return hasMany('Page', 'parent_id', 'id') 
} 
public function parent(){ 
    return hasOne('Page', 'id', 'parent_id'); 
} 

(ジュストそれ自身のページであること、子供に注意してください)

は、次に、あなたが使用します。すべての

Page::with(['children' => function($q){ 
    return $q->orderBy('parent_id'); 
}])->get(); 
+1

@Jose Rojasあなたの配列:[リンク](http://stackoverflow.com/questions/1319903/how-to-flatten-a-multidimensional-array) – Hyti

+0

私はLaravelの 'array_flatten'を試しましたが、それはおそらくそれがトリックをしませんでしたすべてのモデルのコレクションより良い解決策がない場合は、手動で再帰的に平坦化するようにします。ありがとう:) – Giedrius

+1

laravelコレクションでflattenメソッドを使用してみませんか? – Hyti

関連する問題