为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
桃花长相依 2022-08-05 10:56:20
我正在尝试获取子类别的类别树假设我有一个名为“配件”的子类别这个子类别有电子>笔记本电脑的父母所以它是电子产品>笔记本电脑>配件表 :-----------------------------------------| 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);我需要的是给出一个类别,如配件,并获取此子类别的树和获取类别树:电子产品>笔记本电脑>配件。我怎样才能做到这一点?
查看完整描述

4 回答

?
慕妹3146593

TA贡献1820条经验 获得超9个赞

    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;

    }


查看完整回答
反对 回复 2022-08-05
?
largeQ

TA贡献2039条经验 获得超7个赞

这就是我如何让它工作:


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


查看完整回答
反对 回复 2022-08-05
?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

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

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

你可以在这里看到一个使用php实现复合设计模式的例子。


查看完整回答
反对 回复 2022-08-05
?
慕丝7291255

TA贡献1859条经验 获得超6个赞

我正在使用这种结构


您的输入类别模型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选择2

//img1.sycdn.imooc.com//62ec87040001e54c06300548.jpg

查看完整回答
反对 回复 2022-08-05
  • 4 回答
  • 0 关注
  • 163 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信