gpt4 book ai didi

php - Laravel ORM 从自引用表中获取 N 级层次结构 JSON

转载 作者:可可西里 更新时间:2023-10-31 22:52:41 26 4
gpt4 key购买 nike

我正在使用 LARAVEL 4MySQL 后端。

我有一个自引用 表,其中包含id、name、typeparent 列。这里,parentId 列的 foreign-key。表中数据如下:

id  name          type         parent 
1 General group NULL
2 What is..? question 1
3 aa answer 2
4 bb answer 2
5 cc answer 2
6 How is..? question 1
7 ba answer 6
8 bb answer 6
9 Where is..? question 4
10 ca answer 9
11 cb answer 9
12 Who is..? question 6
13 da answer 12
14 db answer 12
15 Specific group NULL
16 When is..? question 15
17 ea answer 16
18 eb answer 16
19 Whome is..? question 2
20 fa answer 19
21 fb answer 19
22 fc answer 19

我想要一个使用此关系数据返回 nested JSON 的函数。例如:

[{
"id" : 1,
"name" : "Geneal",
"type" : "group",
"children" : [{
"id" : 2,
"name" : "What is..?",
"type" : "question",
"children" : [{
"id" : 3,
"name" : "aa",
"type" : "answer"
},
{
"id" : 4,
"name" : "bb",
"type" : "answer"
},
{
"id" : 5,
"name" : "cc",
"type" : "answer"
}]},
{
"id" : 6,
"name" : "How is..?",
"type" : "question",
"children" : [{
"id" : 7,
"name" : "ba",
"type" : "answer"
},
{
"id" : 8,
"name" : "bb",
"type" : "answer"
}]
}]
... and so on
}]

我创建了一个名为 Surveymodel,如下所示:

class Survey extends BaseModel{

protected $table = 'questions';
protected $softDelete = false;

public function parent()
{
return $this->belongsTo('Survey', 'parent');
}

public function children()
{
return $this->hasMany('Survey', 'parent');
}
}

并在 controller 中调用它:

$user = Survey::all();
$parent = $user->parent()->first();
$children = $user->children()->get();

但我没有得到正确的结果,正如我在上面的 JSON 中提到的那样。

print_r($parent->toJson()); 

仅提供一级层次结构的记录(即组和问题,而不是答案)。

同时

print_r($children ->toJson());

只给出问题(不给出分组和答案)。

我想要整个以具有 N 层级的嵌套 JSON 格式的自引用数据

我也试过

$user = Survey::with('parent', 'children')->get();

但发现与上面的 $parent 相同。

有什么办法可以得到想要的结果吗?

提前致谢..

最佳答案

以下是手动检索嵌套关系的方法:

$collection = Model::with('relation1.relation2.relation3')->get();

所以在你的情况下会是:

$surveys = Survey::with('children.children.children')->get();

显然,当关系固定时,这将完成工作,但这不是对同一个表的递归关系的方法。

幸运的是,您可以使这种关系递归,那么检索整棵树所需要做的就是:

$surveys = Survey::with('childrenRecursive');

但是,我不会以这种方式为每一行加载父项。

所以这就是你所需要的:

// Survey model
// loads only direct children - 1 level
public function children()
{
return $this->hasMany('Survey', 'parent');
}

// recursive, loads all descendants
public function childrenRecursive()
{
return $this->children()->with('childrenRecursive');
// which is equivalent to:
// return $this->hasMany('Survey', 'parent')->with('childrenRecursive);
}

// parent
public function parent()
{
return $this->belongsTo('Survey','parent');
}

// all ascendants
public function parentRecursive()
{
return $this->parent()->with('parentRecursive');
}

编辑:要获得真正的树结构,第一个查询必须仅限于根节点:

$surveys = Survey::with('childrenRecursive')->whereNull('parent')->get();

关于php - Laravel ORM 从自引用表中获取 N 级层次结构 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24672629/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com