2017-05-15 111 views
0

如何在Laravel中創建類別的嵌套列表?如何在Laravel中創建類別的嵌套列表?

我想是這樣的結構如下:

  • ---
  • ------ Laravel
  • ---------版本
  • ------------系列
  • --- 的Python
  • ------ Django的
  • --- 紅寶石
  • ..........

我的表字段:

ID | Name | Parent_id 

如果我應該在表中添加另一列告訴我 。

使用這個下面的代碼我',但我認爲這不是很好的旁邊創建類別的嵌套表,我不能這個函數傳遞給我的看法..

function rec($id) 
{ 
    $models = Category::find($id); 

    foreach ($models->children as $chield) { 
      rec($chield->id); 
    } 

    return $models->all(); 
} 

function main() { 
    $models = Category::whereNull('parent_id')->get(); 

    foreach ($models as $parent) { 
    return rec($parent->id); 
} 

回答

0

我解決了這個問題:

$traverse = function ($categories) use (&$traverse) { 
     foreach ($categories as $category) { 
      $traverse($cat->Child); 
     } 
    }; 
    $traverse(array ($category)); 

模型關係:

public function Child() 
{ 
    return $this->hasMany($this, 'parent'); 
} 

public function Parent() 
{ 
    return $this->hasMany($this,'id','parent'); 
} 

(使用我'的hasMany關係,因爲它返回一個數組)

1

,您可以撥打自我指涉的模型:

class Category extends Model { 

    public function parent() 
    { 
     return $this->belongsTo('Category', 'parent_id'); 
    } 

    public function children() 
    { 
     return $this->hasMany('Category', 'parent_id'); 
    } 
} 

,並作出遞推關係:

// recursive, loads all descendants 
public function childrenRecursive() 
{ 
    return $this->children()->with('childrenRecursive'); 
} 

,並獲得PA與他們的所有子女一起出租:

$categories = Category::with('childrenRecursive')->whereNull('parent')->get(); 

最後,您只需迭代兒童,直到兒童爲空。如果你不小心,這肯定會有一些性能問題。如果這是一個相當小的數據集,你打算保持這種方式,它不應該是一個問題。如果這將成爲一個不斷增長的列表,則可以使用root_parent_id或其他方法查詢並手動組裝樹。

+0

這是真棒,THX :)該架構非常好,絕對有助於保存內存 –

+1

很高興我能幫上忙! –