简体   繁体   中英

Laravel display all parent categories as tree for a specific sub-category

I'm trying to get categories tree of a sub-category

Let's say i have a sub-category called Accessories

this sub-category have parents of Electronics > Laptops

So it is Electronics > Laptops > Accessories

Table :

-----------------------------------------
| id    | parent_id     | name          |
|----   |-----------    |-------------  |
| 1     | 0             | Electronics   |
| 2     | 1             | Laptops       |
| 3     | 2             | Accessories   |
-----------------------------------------

I can get the root category of a sub-category like :

function getTopParent($category) {
    if($category->parent_id === null) {
        return $category->name;
    }

    return getTopParent(App\Category::find($category->parent_id));

    // Will return Electronics

}

Also i know how to display categories like tree, see here

function printCategoryName($categories, $parentName = '') {
    foreach ($categories as $category) {
        $name = $parentName ? implode(' > ', [$parentName, $category->name]) : $category->name;
        echo sprintf('%s%s', $name, PHP_EOL);

        if (count($category->children) > 0) {
            printCategoryName($category->children, $name);
        }
    }
}

printCategoryName($categories);

What i need is give a category like Accessories and get tree and get category tree for this sub-category :

Electronics > Laptops > Accessories .

How can i achieve this?

This is how i got it working :

function getParentsTree($category, $name)
{
    if ($category->parent_id == null)
    {
        return $name;
    }

    $parent = Category::find($category->parent_id);
    $name = $parent->name . ' > ' . $name;

    return getParentsTree($parent, $name);
}   

$cat = Category::find(1);
echo getParentsTree($cat, $cat->name);

Output : Electronics > Laptops > Accessories

您应该阅读嵌套集模型

This is a Common problem solved by the composite design pattern

Compose objects into tree structures to represent whole-part hierarchies. Composite lets clients treat individual objects and compositions of objects uniformly. Recursive composition "Directories contain entries, each of which could be a directory." 1-to-many "has a" up the "is a" hierarchy

Source

You can see an example of composite design pattern implementation with php here

I'm using this structure

your enter category model App\\Category.php

class Categories extends Model
{
    public function parent()
    {
       return $this->hasOne('App\Category', 'parent_id','id');
    }
    public function childiren()
    {
       return $this->hasMany('App\Category', 'id','parent_id');
    }
}

your controller ExampleController.php

public function example()
{
    $data = Category::all();
    return view('index', compact('data'));
}

your blade index.blade.php

<select>
    @foreach($data as $categories)
        <optgroup label="{{ $categories->name }}">
            @foreach($categories->children as $category)
                <option value="{{ $category->id }}">{{ $category->name }}</option>
            @endforeach
        </optgroup>
    @endforeach
</select>

also you use jquery select 2

结果列表示例

    protected function getCategoriesTree()
    {
        $categories = Category::where('parent_id',0)->get();

        if($categories->count())
        {
            foreach ($categories as $category) 
            {
                $categories_tree[$category->id] = $this->getChildCategories($category);
            }
        }

        return response()->json(['categories' => $categories_tree]);
    }

    private function getChildCategories($category)
    {
        $sub_categories = [];

        $childs = Category::where('parent_id', $category->id)->get();

        $sub_categories = $category;

        $sub_categories['sub_categories'] = [];

        if($childs->count())
        {
            $sub_categories['sub_categories'] = $childs;
        }

        return $sub_categories;
    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM