Многоуровневая категория в опции выбора - PullRequest
0 голосов
/ 19 апреля 2020

У меня есть таблица категорий:

| cid  | title | slug | parent_id | image |status |

Я хочу показать список категорий в опции выбора, но мне нужно добавить символ da sh ('-') перед любыми категориями, которые имеют родительская категория.

Пример выглядит следующим образом:

Мебель

-Таблица

- Sidetable

--- Таблица дизайнеров

--- Простая таблица

-Софа

-Кресла

-Двери

Контроллер

public function edit($id)
{
    $data=Category::all();
    $item=Category::find($id);
    return view('admin.category.edit',array('item'=>$item,'data'=>$data));
}

Просмотр

@foreach($data as $category)
<option value="{{$category->cid}}" @if($category->cid == $item->parent_id) selected="selected" @endif> {{ $category->parent_id ? ' -- ' . $category->name : $category->name }}</option>
@endforeach

Модель

class Category extends Model
{
    protected 
$primaryKey = 'cid';
protected $table = 'categories';

protected $fillable = 
array('name','url','description','cover','status','parent_id');

function getRouteKeyName() {
    return 'url';
}

public function parents()
{
    return $this->belongsTo('app\Category', 'parent_id');
}

public function children()
{
    return $this->hasMany('app\Category', 'parent_id','cid');
}

}

1 Ответ

0 голосов
/ 19 апреля 2020

Думаю, этот вариант решит проблему (для упрощения некоторые обязательные проверки на пустые значения опущены):

Контроллер:

public $categories = [];
public $optionsList = [];

public function edit($id)
{
    $this->categories = Category::all()->toArray();
    $item = Category::find($id);

    $firstLevelCategories = Arr::where($this->categories, function ($item, $key) {
        return empty($item['parent_id']);
    });
    $this->processCategoriesLevel($firstLevelCategories);

    return view('edit', ['item' => $item, 'data' => $this->optionsList]);
}

private function processCategoriesLevel($categories, $level = 0) {
    $level++;

    foreach ($categories as $key => $category) {
        $children = Arr::where($this->categories, function ($value, $key) use ($category) {
            return $category['cid'] == $value ['parent_id'];
        });
        $this->optionsList[] = [
            'cid' => $category['cid'],
            'name' => str_repeat('-', $level - 1) . ' ' . $category['name'],
        ];

        $this->processCategoriesLevel($children, $level);
    }
}

Просмотр:

@foreach($data as $category)
    <option
        value="{{$category['cid']}}"
        @if($category['cid'] == $item->parent_id) selected="selected" @endif
    >
        {{$category['name']}}
    </option>
@endforeach
...