2017-05-15 141 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

很高兴我能帮上忙! –