Laravel - 子类别显示在主要类别下

标签 laravel categories

你好
我有一个关于类别和子类别的问题
我有这样的表:

ID----- 姓名---- ParentID
1 ------ A ---------- 0
2 ------ B ---------- 0
3 ------ C ---------- 1
我已经显示 A B C ok 。但我需要它会像这样显示:
一个
-- C
B

只是有问题,找不到这样做的方法(在父类别下创建子类别)

注意:我在 Views 中使用 make query 成功了,但我认为它不太好。
我想找到更好的方法
非常感谢

最佳答案

显示子、子和子类别 -

型号

  1. 迁移以下类别表:

    Schema::create('categories', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->tinyInteger('parent_id')->default(0);
        $table->timestamps();
    });
    
  2. 输入您的类别和子类别,如下表结构:

    +-------------+----------------------+----------+
    | id          | name                 |parent_id |
    +-------------+----------------------+----------+
    |           1 | ELECTRONICS          |      0   |
    |           2 | TELEVISIONS          |      1   |
    |           3 | TUBE                 |      2   |
    |           4 | LCD                  |      2   |
    |           5 | PLASMA               |      2   |
    |           6 | PORTABLE ELECTRONICS |      1   |
    |           7 | MP3 PLAYERS          |      6   |
    |           8 | FLASH                |      7   |
    |           9 | CD PLAYERS           |      6   |
    |          10 | 2 WAY RADIOS         |      6   |
    +-------------+----------------------+----------+
    

Controller

  1. MySQL层次递归查询

    $categories = DB::table('categories as c1')
        ->leftJoin('categories as c2','c2.parent_id','=','c1.id')
        ->leftJoin('categories as c3','c3.parent_id','=','c2.id')
        ->leftJoin('categories as c4','c4.parent_id','=','c3.id')
        ->select('c1.id as c1_id','c1.name as c1_name','c2.id as c2_id','c2.name as c2_name','c3.id as c3_id','c3.name as c3_name','c4.id  as c4_id','c4.name as c4_name')
        ->where('c1.parent_id','=',0)
        ->get();
    

输出:

+-----------------+--------------------------+------------------+-----------------+
|c1_id| c1_name   | c2_id| c2_name           | c3_id| c3_name   | c4_id| c4_name  |
+-----------------+--------------------------+------------------+-----------------+
| 1 | ELECTRONICS | 2 | TELEVISIONS          | 3 | TUBE         | NULL  |
| 1 | ELECTRONICS | 2 | TELEVISIONS          | 4 | LCD          | NULL  |
| 1 | ELECTRONICS | 2 | TELEVISIONS          | 5 | PLASMA       | NULL  |
| 1 | ELECTRONICS | 6 | PORTABLE ELECTRONICS | 7 | MP3 PLAYERS  | 8   | FLASH |
| 1 | ELECTRONICS | 6 | PORTABLE ELECTRONICS | 9 | CD PLAYERS   | NULL  |
| 1 | ELECTRONICS | 6 | PORTABLE ELECTRONICS | 10| 2 WAY RADIOS | NULL  |
+-------------+--------------------------------------+--------------+-------+
  1. 然后,将$categories 值放入数组

    $all_categories = [];
    $category_c1_id = '';
    $category_c2_id = '';
    $category_c3_id = '';
    $category_c4_id = '';
    $c1_id = -1;
    $c2_id = -1;
    $c3_id = -1;
    $c4_id = -1;
    foreach ($categories as $k=>$category){
        if($category->c1_id != $category_c1_id){
            $c1_id = $c1_id +1;
            $all_categories[$c1_id]['id'] = $category->c1_id;
            $all_categories[$c1_id]['name'] = $category->c1_name;
            $c2_id = -1;
        }
        if($category->c2_id != $category_c2_id && $category->c2_id <> NULL){
            $c2_id = $c2_id +1;
            $all_categories[$c1_id]['children'][$c2_id]['id'] = $category->c2_id;
            $all_categories[$c1_id]['children'][$c2_id]['name'] = $category->c2_name;
            $c3_id = -1;
        }
        if($category->c3_id != $category_c3_id && $category->c3_id <> NULL){
            $c3_id = $c3_id +1;
            $all_categories[$c1_id]['children'][$c2_id]['children'][$c3_id]['id'] = $category->c3_id;
            $all_categories[$c1_id]['children'][$c2_id]['children'][$c3_id]['name'] = $category->c3_name;
            $c4_id = -1;
        }
        if($category->c4_id != $category_c4_id && $category->c3_id <> NULL){
            $c4_id = $c4_id +1;
            $all_categories[$c1_id]['children'][$c2_id]['children'][$c3_id]['children'][$c4_id]['id'] = $category->c4_id;
            $all_categories[$c1_id]['children'][$c2_id]['children'][$c3_id]['children'][$c4_id]['name'] = $category->c4_name;
        }
        $category_c1_id = $category->c1_id;
        $category_c2_id = $category->c2_id;
        $category_c3_id = $category->c3_id;
        $category_c4_id = $category->c4_id;
    }
    return $all_categories;
    

    输出:

    $categories = [
      ['id' => 1, 'name' => 'TV & Home Theather'],
      ['id' => 2, 'name' => 'Tablets & E-Readers'],
      ['id' => 3, 'name' => 'Computers', 'children' => [
        ['id' => 4, 'name' => 'Laptops', 'children' => [
          ['id' => 5, 'name' => 'PC Laptops'],
          ['id' => 6, 'name' => 'Macbooks (Air/Pro)']
        ]],
        ['id' => 7, 'name' => 'Desktops'],
        ['id' => 8, 'name' => 'Monitors']
      ]],
      ['id' => 9, 'name' => 'Cell Phones']
    ];
    

查看

  1. 现在显示在选择产品上传选项

    <div class="form-group">
        <label>Select Categories</label><br/>
        @foreach($categories as $category)
            @php($category = (object)$category)
            <div class="form-check">
                <label class="form-check-label" for="{{$category->id}}">
                    {{ Form::checkbox('category_ids[]', $category->id, null, array('id'=>$category->id)) }}
                    {{$category->name}}
                </label>
                @if(isset($category->children))
                    @foreach($category->children as $subcategory)
                        @php($subcategory = (object)$subcategory)
                        <div class="form-check" style="margin-left: 15px;">
                            <label class="form-check-label" for="{{$subcategory->id}}">
                                {{ Form::checkbox('category_ids[]', $subcategory->id, null, array('id'=>$subcategory->id)) }}
                                {{$subcategory->name}}
                            </label>
                            @if(isset($subcategory->children))
                                @foreach($subcategory->children as $subsubcategory)
                                    @php($subsubcategory = (object)$subsubcategory)
                                    <div class="form-check" style="margin-left: 15px;">
                                        <label class="form-check-label" for="{{$subsubcategory->id}}">
                                            {{ Form::checkbox('category_ids[]', $subsubcategory->id, null, array('id'=>$subsubcategory->id)) }}
                                            {{$subsubcategory->name}}
                                        </label>
                                    </div>
                                @endforeach
                            @endif
                        </div>
                    @endforeach
                @endif
            </div>
        @endforeach
    </div>
    

    开启菜单选项

    <ul class="nav primary clone-main-menu toggle-slide-menu" id="mercado_main" data-menuname="Main menu" >
      @foreach($categories as $category)
          <li class="menu-item menu-item-has-children item-megamenu" >
              <a href="#" title="Digital & Electronics" class="link-term mercado-item-title">{{$category['name']}}</a>
              <div class="wrap-megamenu">
                  <div class="megamenu-content min-height-510 bg-vertical-digital">
                      @if(isset($category['children']))
                          <div class="row">
                              @foreach($category['children'] as $subcategory)
                                  <div class="col-lg-3 col-md-3">
                                      <div class="wrap-vertical-nav">
                                          <h2 class="menu-title"><a href="#" class="link-term">{{$subcategory['name']}}</a></h2>
                                          @if(isset($subcategory['children']))
                                              <ul>
                                                  @foreach($subcategory['children'] as $subcategory)
                                                      <li class="menu-item"><a href="#" class="link-term">{{$subcategory['name']}}</a></li>
                                                  @endforeach
                                              </ul>
                                          @endif
    
                                      </div>
                                  </div>
                              @endforeach
                          </div>
                      @endif
                  </div>
              </div>
          </li>
      @endforeach
    </ul>
    

关于Laravel - 子类别显示在主要类别下,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24257892/

相关文章:

php - 访问 laravel blade 中的数组级别

javascript - 如何根据模态选择更新输入

mysql - 仅显示类别一次

php - WP-电子商务在产品页面上显示类别名称

objective-c - 一个类别可以在 Objective C 中实现一个协议(protocol)吗?

laravel - 如何连接两个laravel应用程序?

php - SQLSTATE[HY000] [1045] 用户 'username' @'localhost' 的访问被拒绝(使用密码 : YES)

python - 博客类别 Slugify 在 Django 中不起作用

java - 在 Spring 中替换类别的标签系统 - Hibernate java 项目

php - 在 Windows 上仅安装 PHP 时,默认情况下所有 php 扩展都会被注释掉?