同一模型上雄辩的亲子关系

新手上路,请多包涵

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

数据库结构:

在此处输入图像描述

模型中的关系:

     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": []
              }
            ]
          }
        ]
      }
    ]
  }
]

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

原文由 Kiran LM 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 361
2 个回答

如果你有这样的未知深度,你将不得不递归地获取孩子。

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

“嵌套集是实现有序树的一种聪明方法,它允许快速、非递归查询。” - https://github.com/etrepat/baum

使用此包,您可以使用 getDescendants 等方法获取所有子项和嵌套子项,以及 toHierarchy 获取完整的树层次结构。

维基百科 - 嵌套集模型

Baum - Laravel Eloquent ORM 的嵌套集模式

在 MySQL 中管理分层数据

原文由 lagbox 发布,翻译遵循 CC BY-SA 3.0 许可协议

您应该在子关系中使用 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');
}

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

原文由 Shyam Achuthan 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏