php – 来自自引用表的Laravel ORM获得N级层次结构JSON

前端之家收集整理的这篇文章主要介绍了php – 来自自引用表的Laravel ORM获得N级层次结构JSON前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用带有 MySQL后端的LARAVEL 4.

我有一个自引用表,其中包含列id,名称,类型和父级.
这里,parent是列Id的外键.表中的数据如下:

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

我想要一个使用此关系数据返回嵌套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",{
         "id" : 5,"name" : "cc","type" : "answer"
      }]},{
      "id" : 6,"name" : "How is..?","children" : [{
         "id" : 7,"name" : "ba",{
         "id" : 8,"type" : "answer"
      }]
   }]
... and so on
}]

我创建了一个名为Survey的模型,如下所示:

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');
    }   
}

并在控制器中调用它:

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

但是我没有得到正如我在JSON上面提到的那样正确的结果.

print_r($parent->toJson());

只给出一级层次结构的记录(即组和问题,而不是答案).

print_r($children ->toJson());

只提出问题(不是小组和答案).

我希望嵌套的JSON格式的整个自引用数据具有N级层次结构.

我也试过了

$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();
原文链接:https://www.f2er.com/laravel/136063.html

猜你在找的Laravel相关文章