2017-05-15 2 views
0

Comment créer une liste de catégories imbriquée dans Laravel?Comment créer une liste imbriquée de catégories dans Laravel?

Je veux être quelque chose comme cette structure suivante:

  • --- Php
  • ------ Laravel
  • --------- Version
  • ------------ Série
  • --- Python
  • ------ Django
  • --- Ruby
  • ..........

MaTable Domaines:

ID | Name | Parent_id 

Si je dois ajouter une autre colonne dans ma table s'il vous plaît disent moi .

en utilisant ce code I'am ci-dessous, mais je pense que ce n'est pas très bien pour la création de liste imbriquée des catégories à côté, je ne peux pas passer cette fonction à mon avis ..

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); 
} 

Répondre

0

Je résolu le problème:

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

La relation du modèle:

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

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

(en utilisant la relation I'am hasMany car elle retourne un tableau)

1

Vous pouvez faire une modèle d'auto-référentiel:

class Category extends Model { 

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

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

et faire une relation récursive:

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

et pour obtenir pa loyers avec tous leurs enfants:

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

Enfin vous devez simplement itérer les enfants jusqu'à ce que les enfants est nulle. Il peut certainement y avoir des problèmes de performance avec ceci si vous ne faites pas attention. S'il s'agit d'un ensemble de données relativement petit que vous prévoyez de conserver, cela ne devrait pas poser de problème. Si cela doit être une liste de plus en plus longue, il peut être logique d'avoir un root_parent_id ou quelque chose à interroger et assembler l'arbre manuellement.

+0

C'est génial, thx :) L'architecture est très bonne, contribue certainement à préserver la mémoire –

+1

Content de pouvoir aider! –