从两个表创建树结构

问题描述 投票:0回答:1

所以,我的问题是我需要用来自两个表的数据来构建树。

我有下表:

Category:

| id | parent_id | name           |
|----|-----------|----------------|
| 1  | null      | Category 1     |
| 2  | 1         | Category 1.1   |
| 3  | 2         | Category 1.1.1 |
| 4  | null      | Category 2     |
| 5  | 4         | Category 2.1   |
| 6  | null      | Category 3     |


Layer:

| id | category_id | name    |
|----|-------------|---------|
| 1  | 2           | Layer 1 |
| 2  | 2           | Layer 2 |
| 3  | 3           | Layer 3 |
| 4  | 4           | Layer 4 |
| 5  | 4           | Layer 5 |
| 6  | 5           | Layer 6 |

我正在使用以下功能来构建类别树:

public function index()
{
    $categories = Category::all();
    $layers = Layer::all();

    return $this->buildTree($categories->toArray(), null);
}


function buildTree($categories, $parent_id)
{
    $categoriesTree = [];
    foreach ($categories as $category) {
        $category['folder'] = true;

         if ($category['parent_id'] == $parent_id) {
            $childrens = $this->buildTree($categories, $category['id']);
            if ($childrens) {
                $category['childrens'] = $childrens;
            }

            $categoriesTree[] = $category;
        }
    }

    return $categoriesTree;
}

上述功能对类别有效,响应为:

  • 类别1
    • 类别1.1
      • 类别1.1.1
  • 类别2
    • 类别2.1
  • 类别3

但是我想将图层添加为相应类别的子级,如下所示:

  • 类别1
    • 类别1.1
      • 类别1.1.1
        • 第3层
      • 第一层
      • 第2层
  • 类别2
    • 类别2.1
      • 第6层
    • 第4层
    • 第5层
  • 类别3

最佳方法是什么?

php laravel eloquent tree treeview
1个回答
0
投票

我建议在您的Category模型中将relationshipLayer模型一起使用,并急于加载它。这样,您就可以达到相同的结果,但buildTree函数的开销却更少,因为Laravel可以完成大部分工作:

Category.php模型

class Category extends Model
{
    // ...

    public function layers()
    {
        return $this->hasMany(Layer::class);
    }

    // ...
}

在您的控制器中:

public function index()
{
    $categories = Category::with('layers')->get();

    // ...
}

这将导致这样的数组:

eager loaded layers per category

© www.soinside.com 2019 - 2024. All rights reserved.