2017-10-03 6 views
0

je les modèles et les relations suivantesLaravel 5: Comment obtenir toutes les annonces d'une catégorie incluant toutes les sous-catégories

class Advert extends Model 
{ 
    public function category() { 
     return $this->belongsTo('App\Category'); 
    } 
} 

class Category extends Model 
{ 

    public function parent() { 
     return $this->belongsTo('App\Category', 'category_id','id'); 
    } 

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

    public function adverts() { 
     return $this->hasMany('App\Advert'); 
    } 
} 

Je table avec annonces qui appartiennent à une catégorie ... catégorie de l'annonce peut être un sous-catégorie d'une autre catégorie ... Niveau sous-catégorie est max 4. Comment puis-je récupérer toutes les publicités de toutes les sous-catégories à travers la catégorie racine principale, il appartient.

Par exemple

<ul> 
 
<li>Smartphones 
 
    <ul> 
 
     <li>Android 
 
      <ul> 
 
       <li>Samsung</li> 
 
       <li>Huawei</li> 
 
       <li>LG</li> 
 
       <li>Meizu</li> 
 
       <li>Acer</li> 
 
      </ul> 
 
     </li> 
 
     <li>Apple 
 
      <ul> 
 
       <li>iPhone 5</li> 
 
       <li>iPhone 6</li> 
 
       <li>iPhone X</li> 
 
      </ul> 
 
     </li> 
 
    </ul> 
 
</li> 
 
</ul>

Comment puis-je obtenir toutes les annonces de toutes les sous-catégories, par exemple si je clique sur Smartphones ... Dois-je itérer chaque niveau ou il y a un solution plus facile avec les relations ...

Merci

+0

Créez une fonction récursive qui prend en paramètre la catégorie actuelle. Dans cette fonction, vérifiez si cette catégorie a des enfants. Echo les enfants, et effectuez une vérification s'ils ont des enfants, si c'est le cas, appelez la fonction que vous venez de créer pour ces enfants, à partir de la boucle dans la fonction –

+0

Cela semble très similaire: https://stackoverflow.com/a/ 38216669/1744771 –

+0

@JamesSheils ce genre m'a aidé mais c'est ne pas aller chercher les publicités du dernier niveau de catégories ... – BinaryNeno

Répondre

0

vous pouvez faire des relations récursive

class Advert extends Model 
{ 
    public function category() { 
     return $this->belongsTo('App\Category'); 
    } 
} 

class Category extends Model 
{ 

    public function parent() { 
     return $this->belongsTo('App\Category', 'category_id','id'); 
    } 

    public function parentRecursive() 
    { 
     return $this->parent()->with('parentRecursive'); 
    } 



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

    public function childrenRecursive() 
    { 
     return $this->children()->with('childrenRecursive'); 

    } 

    public function adverts() { 
     return $this->hasMany('App\Advert'); 
    } 
} 

pour obtenir annonces avec des résultats récursives

$adverts = Advert::with('Category') 
    ->with('Category.childrenRecursive')->whereNull('Category.parent')->get(); 
+0

J'ai essayé ceci et cela ne fonctionne pas: / – BinaryNeno

0

Essayez d'utiliser package nested sets. C'est génial et fais facilement ce travail.