【问题标题】:How to show menu dynamically in Laravel如何在 Laravel 中动态显示菜单
【发布时间】:2017-12-20 21:09:27
【问题描述】:

我正在尝试在 laravel 中动态显示菜单。

我有两张桌子,一张是主类别,另一张是子类别

这是Category表的结构

  ----------------------------------
  | id | title   | slug  |  type   |
  | 1  | title1  | slug1 | Android |
  | 2  | title2  | slug2 | Android |
  | 3  | title3  | slug3 | Android |
  | 4  | title4  | slug4 | Ubuntu  |
  | 5  | title5  | slug5 | Ubuntu  |
  ----------------------------------

子类别结构

  -----------------------------------------------
  | id | title   | slug  | category_of|
  | 1  | title1  | slug1 | 1          |
  | 2  | title2  | slug2 | 1          |
  | 3  | title3  | slug3 | 1          |
  | 4  | title4  | slug4 | 2          |
  | 5  | title5  | slug5 | 1          |
  -----------------------------------------------

这是我尝试过的

<?php
    $category = App\Models\Menu::where('categories.type', 'Android')
                ->select('categories.*', 'sub_category.slug as sub_slug', 'sub_category.title')
                ->join('sub_category', 'sub_category.category_of', '=', 'categories.id')
                ->get();
            ?>
   @foreach ($category as $value)

<li class="inner-dropdown-item">
    <p>
  <a href="{{ Config::get('constants.url.BASE_URL') }}category/{{$value->slug}}/">{{ucwords(str_replace('-', ' ', $value->slug))}}</a>
    </p>
  </li>

  <li class="inner-dropdown-item">
      <a href="{{ Config::get('constants.url.BASE_URL') }}category/{{$value->sub_slug}}/{{$value->sub_slug}}">{{ucwords(str_replace('-', ' ', $value->sub_slug))}}</a>
  </li>

 @endforeach

我面临的问题是,由于 foreach 循环,它每次都复制主类别,例如

<li class="inner-dropdown-item">
    <p>
       <a href="/category/android/">Android</a>
    </p>
</li>

<li class="inner-dropdown-item">
     <a href="/category/android/calendars">Calendars</a>
</li>

     <!-- /INNER DROPDOWN ITEM -->

<!-- /This Below Android category should not be shown again -->
<li class="inner-dropdown-item">
    <p>
       <a href="/category/android/">Android</a>
    </p>
</li>

<li class="inner-dropdown-item">
    <a href="/category/android/database-abstractions">Database Abstractions</a>
</li>

如您所见,每次显示子类别时都会复制主类别。我如何显示主类别一次,然后在其下显示所有子类别

我有另一个具有不同菜单 HTML 结构的模板

<!-- MENU ITEM -->
                <li class="menu-item sub">
                    <a href="#">
                        Designer
                        <!-- SVG ARROW -->
                        <svg class="svg-arrow">
                            <use xlink:href="#svg-arrow"></use>
                        </svg>
                        <!-- /SVG ARROW -->
                    </a>

                    <div class="content-dropdown">
                        <!-- FEATURE LIST BLOCK -->

                        <?php $m_des = ''; ?>
                        @foreach ($design_category as $des_value)

                            @if($m_des != $des_value->slug)
                            <div class="feature-list-block">
                                <a href="{{ Config::get('constants.url.BASE_URL') }}category/{{$des_value->slug}}/">
                                    <h6 class="feature-list-title">{{ucwords(str_replace('-', ' ', $des_value->slug))}}</h6></a>
                                <hr class="line-separator">
                                <?php $m_des = $des_value->slug; ?>
                                @endif
                                <!-- FEATURE LIST -->
                                <ul class="feature-list">

                                    <li class="feature-list-item">
                                        <a href="{{ Config::get('constants.url.BASE_URL') }}category/{{$des_value->slug}}/{{$des_value->sub_slug}}/">{{ucwords(str_replace('-', ' ', $des_value->sub_slug))}}</a>
                                    </li>

                                </ul>
                                <!-- /FEATURE LIST -->
                            </div>
                        @endforeach
                    </div>

                </li>
                <!-- /MENU ITEM -->

它一次又一次地生成 ul 和 div 导致 html 错误

【问题讨论】:

  • 您使用的join 没有group,因此每个条目会获得多行,具体取决于sub_categories 的数量
  • @colburton 我如何按组进行操作?

标签: php mysql laravel laravel-5


【解决方案1】:

可能有更好的解决方案。但是你可以试试这个。请按categories.id 订购,然后在循环中检查是否上次打印主类别

<?php
    $category = App\Models\Menu::where('categories.type', 'Android')
                ->select('categories.*', 'sub_category.slug as sub_slug', 'sub_category.title')
                ->join('sub_category', 'sub_category.category_of', '=', 'categories.id')
                ->orderBy('categories.id');
                ->get();
$latest_category = "";
            ?>
   @foreach ($category as $value)
<?php if($latest_category != $value->slug){ ?>
<li class="inner-dropdown-item">
    <p>
  <a href="{{ Config::get('constants.url.BASE_URL') }}category/{{$value->slug}}/">{{ucwords(str_replace('-', ' ', $value->slug))}}</a>
    </p>
  </li>
<?php 
$latest_category = $value->slug;
} ?>
  <li class="inner-dropdown-item">
      <a href="{{ Config::get('constants.url.BASE_URL') }}category/{{$value->sub_slug}}/{{$value->sub_slug}}">{{ucwords(str_replace('-', ' ', $value->sub_slug))}}</a>
  </li>

 @endforeach

编辑

<div class="content-dropdown">
                        <!-- FEATURE LIST BLOCK -->

    <?php $m_des = ''; 
    $end_div = '';
    ?>
    @foreach ($design_category as $des_value)

        @if($m_des != $des_value->slug)
        {{$end_div}}
        <div class="feature-list-block">
            <a href="{{ Config::get('constants.url.BASE_URL') }}category/{{$des_value->slug}}/">
                <h6 class="feature-list-title">{{ucwords(str_replace('-', ' ', $des_value->slug))}}</h6></a>
            <hr class="line-separator">
            <?php $m_des = $des_value->slug; 
            $end_div = "</div>";
            ?>
            @endif
            <!-- FEATURE LIST -->
            <ul class="feature-list">

                <li class="feature-list-item">
                    <a href="{{ Config::get('constants.url.BASE_URL') }}category/{{$des_value->slug}}/{{$des_value->sub_slug}}/">{{ucwords(str_replace('-', ' ', $des_value->sub_slug))}}</a>
                </li>

            </ul>
            <!-- /FEATURE LIST -->        
    @endforeach
    {{$end_div}}
</div>

【讨论】:

  • 感谢您的方法工作
  • 检查编辑的答案,让我知道它的工作与否
  • 是否可以在主类别中只显示一次 ul 标签,然后在下一个类别中再次显示,因为这样 ul 标签也会一次又一次地填充
  • ul应用相同的逻辑
猜你喜欢
  • 1970-01-01
  • 2020-12-09
  • 1970-01-01
  • 1970-01-01
  • 2015-01-23
  • 1970-01-01
  • 1970-01-01
  • 2018-11-18
  • 2014-09-12
相关资源
最近更新 更多