Saltar al contenido

¿Cómo crear una lista anidada de categorías en Laravel?

Solución:

Puedes hacer un modelo autorreferencial:

class Category extends Model {

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

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

y hacer una relación recursiva:

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

y conseguir padres con todos sus hijos:

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

Por último, solo necesita iterar a través de los niños hasta que los niños sean nulos. Definitivamente puede haber algunos problemas de rendimiento con esto si no tiene cuidado. Si se trata de un conjunto de datos bastante pequeño que planea mantener así, no debería ser un problema. Si esta va a ser una lista cada vez mayor, podría tener sentido tener una root_parent_id o algo para consultar y ensamblar el árbol manualmente.

Si alguien necesita una mejor respuesta, busque mi respuesta, me ayudó cuando me enfrenté a tal problema.

   class Category extends Model {

     private $descendants = [];

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

     public function hasChildren(){
            if($this->children->count()){
                return true;
            }

            return false;
        }

     public function findDescendants(Category $category){
            $this->descendants[] = $category->id;

            if($category->hasChildren()){
                foreach($category->children as $child){
                    $this->findDescendants($child);
                }
            }
        }

      public function getDescendants(Category $category){
            $this->findDescendants($category);
            return $this->descendants;
        }
 }

Y en su controlador simplemente pruebe esto:

$category = Category::find(1);
$category_ids = $category->getDescendants($category);

Obtendrá identificadores en la matriz de todos los descendientes de su categoría donde id = 1. luego :

$products = Product::whereIn('category_id',$category_ids)->get();

De nada =)

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *