繁体   English   中英

Laravel 将所有父类别显示为特定子类别的树

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

我正在尝试获取子类别的类别树

假设我有一个名为配件的子类别

这个子类别有电子产品 > 笔记本电脑的父母

所以它是电子 > 笔记本电脑 > 配件

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

我可以获得子类别的根类别,例如:

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

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

    // Will return Electronics

}

我也知道如何显示树之类的类别, 请参见此处

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

我需要的是提供一个像配件这样的类别,并为这个子类别获取树和类别树:

电子产品 > 笔记本电脑 > 配件

我怎样才能做到这一点?

这就是我让它工作的方式:

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

输出: Electronics > Laptops > Accessories

您应该阅读嵌套集模型

这是复合设计模式解决的常见问题

将对象组合成树结构以表示整体部分层次结构。 Composite 允许客户端统一处理单个对象和对象的组合。 递归组合“目录包含条目,每个条目都可以是一个目录。” 一对多的“有一个”在“是一个”层次结构中

来源

您可以在此处查看使用 php 实现复合设计模式的示例

我正在使用这种结构

您输入的类别模型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');
    }
}

你的控制器ExampleController.php

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

你的刀片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>

你也使用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;
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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