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

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

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

PHP
慕姐4208626 2022-07-22 15:12:26
我正在尝试获取子类别的类别树假设我有一个名为“配件”的子类别这个子类别有电子 > 笔记本电脑的父母所以它是电子产品 > 笔记本电脑 > 配件表:-----------------------------------------| 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 回答

?
桃花长相依

TA贡献1860条经验 获得超8个赞

    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-07-22
?
慕桂英546537

TA贡献1848条经验 获得超10个赞

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


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-07-22
?
大话西游666

TA贡献1817条经验 获得超14个赞

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

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

资源

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



查看完整回答
反对 回复 2022-07-22
?
红颜莎娜

TA贡献1842条经验 获得超12个赞

我正在使用这种结构


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

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

查看完整回答
反对 回复 2022-07-22
  • 4 回答
  • 0 关注
  • 111 浏览

添加回答

举报

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