Создать кнопку выбора с вложенными категориями в Laravel

извините за ненормативную лексику :) У меня есть таблица с такими многоуровневыми категориями:

category_id ------ category_name--------parent_id
1------------------sample 1 ------------ NULL
2------------------sample 2 ------------ 1
3------------------sample 3 ------------ NULL

а также...

теперь мне нужно, чтобы эти данные были в меню выбора параметров

это моя форма:

<div class = "form-group">
        <label class = "col-sm-2 control-label">مادر</label>
        <div class = "text-right col-sm-10">
            <select name = "parent_id" class = "select2 form-control" id = "parent_id">
                <option value = "">انتخاب دسته مادر</option>
                @foreach ($categories as $cat)
                    <option value = "{{ $cat -> category_id }}"
                            {{ isset($productItem) && $productItem->category_id == $cat->category_id ? 'selected':'' }}
                    >{{ $cat -> category_name }}</option>
                @endforeach
            </select>
        </div>
    </div>

Из того, что я вижу, ваш код не «заботится» об уровне категории / родителя. Это твоя цель?

Mtxz 26.09.2018 17:58

да, пожалуйста, смотрите ниже

hadi moazen 26.09.2018 19:14

Мой ответ то, что вы искали?

Mtxz 27.09.2018 11:14
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
3
1 264
3

Ответы 3

должно быть так

но на уровне 3 у меня проблема

и я изменил свой код:

<select name = "parent_id" class = "select2 form-control" id = "parent_id">
                <option value = "">انتخاب دسته مادر</option>
                @foreach ($categories as $cat)
                    @if ($cat -> parent_id == NULL)
                        <option value = "{{ $cat -> category_id }}">
                            {{ $cat -> category_name }}
                        </option>
                    @endif
                    @if ($cat->children->count() > 0)
                        @foreach($cat->children as $child)
                            <option value = "{{ $child -> category_id }}">
                                {{ $child -> category_name }}
                            </option>
                        @endforeach
                    @endif
                @endforeach
            </select>

Лучше отредактировать свой вопрос, чем публиковать обновление в качестве ответа.

Mtxz 27.09.2018 01:12

Вы должны использовать <optgroup> для создания «вложенных» опций. Проверьте этот пример.

Ваш код будет:

<select name = "parent_id" class = "select2 form-control" id = "parent_id">
  <option value = "">انتخاب دسته مادر</option> <!-- default -->
  @foreach ($categories->where('parent_id', null) as $cat) <!-- first level only: no parent -->

    <!-- if parent must also be selectable, you can add an option for it before its optgroup -->
    <option value = "{{ $cat->category_id }}">
      {{ $cat->category_name }}
    </option>

    @if ($cat->children->count()) <!-- if has children -->
    <optgroup label = "{{$cat->category_name}}"> <!-- display parent optgroup and within child categories option -->
      @foreach($cat->children as $child)
        <option value = "{{ $child -> category_id }}">
          {{ $child -> category_name }}
        </option>
      @endforeach
    </optgroup>
    @endif
  @endforeach
</select>

Это должно создать:

  • <optgroup> для каждой родительской категории
  • <option> размещен непосредственно перед optgroup для родительских категорий
  • <option> для каждой дочерней категории

Надеясь найти ответ, который хорошо использует Laravel, я закончил тем, что сдался и просто написал код, чтобы делать то, что я хотел сам, и он оказался меньше, чем я ожидал.

public function get_categories()
{

    $categories = Category::where('parent',null)->get();
    while(count($categories) > 0){
        $nextCategories = [];
        echo "<option value='.$categories->.'>'.$categories->name .'</option";
        foreach ($categories as $category) {
          $childCategories = Category::where('parent',$category->id)->get();
          echo "<option value='.$categories->.'>'.$childCategories->name .'</option";
        }
    }

}

Другие вопросы по теме