同一模型上的雄辩亲子关系数据库结构:模型中的关系:试:预期输出:

2022-08-30 15:12:15

我有一个模型,每个项目都与同一个模型相关。CourseModule

数据库结构:

enter image description here

模型中的关系:

    public function parent()
    {
        return $this->belongsTo('App\CourseModule','parent_id')->where('parent_id',0);
    }

    public function children()
    {
        return $this->hasMany('App\CourseModule','parent_id');
    }

我尝试了以下方法,但它只返回一个关系级别。

试:

CourseModule::with('children')->get();

我正在尝试创建如下所示的json输出,

预期输出:

[
  {
    "id": "1",
    "parent_id": "0",
    "course_id": "2",
    "name": "Parent",
    "description": "first parent",
    "order_id": "1",
    "created_at": "-0001-11-30 00:00:00",
    "updated_at": "-0001-11-30 00:00:00",
    "children": [
      {
        "id": "2",
        "parent_id": "1",
        "course_id": "2",
        "name": "Child 1",
        "description": "child of parent",
        "order_id": "2",
        "created_at": "-0001-11-30 00:00:00",
        "updated_at": "-0001-11-30 00:00:00",
        "children": [
          {
            "id": "3",
            "parent_id": "2",
            "course_id": "2",
            "name": "Child2",
            "description": "child of child1",
            "order_id": "2",
            "created_at": "-0001-11-30 00:00:00",
            "updated_at": "-0001-11-30 00:00:00",
            "children": [
              {
                "id": "4",
                "parent_id": "3",
                "course_id": "2",
                "name": "Child 3",
                "description": "child of child 2",
                "order_id": "2",
                "created_at": "-0001-11-30 00:00:00",
                "updated_at": "-0001-11-30 00:00:00",
                "children": []
              }
            ]
          }
        ]
      }
    ]
  }
]

我不明白如何获取内部子对象。


答案 1

应在子关系和父关系中使用。with('children')with('parent')

为了使您的代码成为递归:

public function parent()
{
    return $this->belongsTo('App\CourseModule','parent_id')->where('parent_id',0)->with('parent');
}

public function children()
{
    return $this->hasMany('App\CourseModule','parent_id')->with('children');
}

注意:确保您的代码具有一些或其他退出条件,否则它将最终进入永无止境的循环。


答案 2

如果你有一个未知的深度,你将不得不递归地得到孩子。

另一种选择是使用嵌套集模型而不是邻接列表模型。你可以使用类似 Laravel 的包来嵌套集。baum/baum

“嵌套集是实现有序树的明智方法,允许快速,非递归查询 https://github.com/etrepat/baum

使用此包,您可以使用诸如获取所有子项和嵌套子项以及获取完整树层次结构之类的方法。getDescendantstoHierarchy

维基百科 - 嵌套集模型

鲍姆 - 拉拉维尔雄辩ORM的嵌套集模式

在 MySQL 中管理分层数据


推荐