Рекурсивная функция для получения вложенных элементов с отношениями родитель-потомок

Я хотел получить данные вложенных категорий из таблицы MySQL в Laravel 7.

Это таблица MySQL:

------------------------
|id | name | parent_id |
|---|------|-----------|
| 1 |   A  |   NULL    |
|---|------|-----------|
| 2 |   B  |   NULL    |
|---|------|-----------|
| 3 |   C  |   NULL    |
|---|------|-----------|
| 4 |  a   |     1     |
|---|------|-----------|
| 5 |  ab  |     4     |
|---|------|-----------|
| 6 |  bc  |     4     |
|---|------|-----------|
| 7 |  ca  |     4     |
|---|------|-----------|
| 8 |   b  |     2     |
|---|------|-----------|
| 9 |  2b  |     8     |
|---|------|-----------|
|10 |  3b  |     8     |
|---|------|-----------|
|11 |   c  |     3     |
|---|------|-----------| 

Мне нужен следующий результат:

A
a
ab
bc
ca
B
b
2b
3b
C
c

Мой текущий код (в контроллере):

public function sort_category($data, $opt){      
        $contents = Category::where('category_id', $data)->get();
        foreach($contents as $c){
            $opt .= "<option value='".$c->id."'>".$c->name."</option>";
            $count = Category::where('category_id', $c->id)->count();
            if($count > 0){
                return $this->sort_category($c->id, $opt);
            }

        }

    return $opt;
}

public function add_category_form(){
    $opt = '';
    $html = $this->sort_category(NULL, $opt);
    return view('admin.add_category', ['categories' => $html]);

}

Текущий выход:

A
a
ab
bc
ca

Как видите, он не проходит через B и C. Любая помощь приветствуется.

1 ответ

Решение

У вас есть оператор возврата внутри цикла foreach.

Это приводит к тому, что только первое значение с category_id обрабатывается, а не другие.

Вы не должны возвращаться напрямую, а должны сохранять возвращаемые значения, например, в массиве и возвращаться после цикла.

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