php – 来自自引用表的Laravel ORM获得N级层次结构JSON
发布时间:2020-12-14 19:46:57 所属栏目:大数据 来源:网络整理
导读:我正在使用带有 MySQL后端的LARAVEL 4. 我有一个自引用表,其中包含列id,名称,类型和父级. 这里,parent是列Id的外键.表中的数据如下: id name type parent 1 General group NULL2 What is..? question 13 aa answer 24 bb answer 25 cc answer 26 How is..?
我正在使用带有
MySQL后端的LARAVEL 4.
我有一个自引用表,其中包含列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(); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |