我正在使用 LARAVEL 4 和 MySQL 后端。
我有一个自引用 表,其中包含id、name、type 和parent 列。
这里,parent 是 Id 列的 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
}]
我创建了一个名为 Survey 的 model,如下所示:
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/
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h
在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这
给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最
我有一个非常简单的RubyRack服务器,例如:app=Proc.newdo|env|req=Rack::Request.new(env).paramspreq.inspect[200,{'Content-Type'=>'text/plain'},['Somebody']]endRack::Handler::Thin.run(app,:Port=>4001,:threaded=>true)每当我使用JSON对象向服务器发送POSTHTTP请求时:{"session":{"accountId":String,"callId":String,"from":Object,"headers":
您将如何构建一个简单的Sinatra应用程序?我正在制作,我希望该应用具有以下功能:“应用程序”更像是一个包含所有信息的管理仪表板。然后另一个应用程序将通过REST访问信息。我还没有创建仪表板,只是从数据库中获取东西session和身份验证(尚未实现)您可以上传图片,其他应用可以显示这些图片我已经使用RSpec创建了一个测试文件通过Prawn生成报告目前的设置是这样的:app.rbtest_app.rb因为我实际上只有应用程序和测试文件。到目前为止,我已经将Datamapper用于ORM,将SQLite用于数据库。这是我的第一个Ruby/Sinatra项目,所以欢迎任何和所有建议-我应
我正在使用ruby2.1.0我有一个json文件。例如:test.json{"item":[{"apple":1},{"banana":2}]}用YAML.load加载这个文件安全吗?YAML.load(File.read('test.json'))我正在尝试加载一个json或yaml格式的文件。 最佳答案 YAML可以加载JSONYAML.load('{"something":"test","other":4}')=>{"something"=>"test","other"=>4}JSON将无法加载YAML。JSON.load("
我想编写一个ruby脚本来递归复制目录结构,但排除某些文件类型。因此,给定以下目录结构:folder1folder2file1.txtfile2.txtfile3.csfile4.htmlfolder2folder3file4.dll我想复制这个结构,但不包含.txt和.cs文件。因此,生成的目录结构应如下所示:folder1folder2file4.htmlfolder2folder3file4.dll 最佳答案 您可以使用查找模块。这是一个代码片段:require"find"ignored_extensions=[".cs"
我在一个简单的RailsAPI中有以下Controller代码:classApi::V1::AccountsControllerehead:not_foundendendend问题在于,生成的json具有以下格式:{id:2,name:'Simpleaccount',cash_flows:[{id:1,amount:34.3,description:'simpledescription'},{id:2,amount:1.12,description:'otherdescription'}]}我需要我生成的json是camelCase('cashFlows'而不是'cash_flows'
我正在学习如何使用JSONgem解析和生成JSON。我可以轻松地创建数据哈希并将其生成为JSON;但是,在获取一个类的实例(例如Person实例)并将其所有实例变量放入哈希中以转换为JSON时,我脑袋放屁。这是我遇到问题的例子:require"json"classPersondefinitialize(name,age,address)@name=name@age=age@address=addressenddefto_jsonendendp=Person.new('JohnDoe',46,"123ElmStreet")p.to_json我想创建一个.to_json方法,这样我就可以获
我正在构建一个带有Rails后端的JS应用程序,为了不混淆snake和camelcases,我想通过从服务器返回camelcase键名来规范化这一切。因此,当从API返回时,user.last_name将返回user.lastName。我如何实现这一点?谢谢!编辑:添加Controller代码classApi::V1::UsersController 最佳答案 我的方法是使用ActiveModelSerializer和json_api适配器:在你的Gemfile中,添加:gem'active_model_serializers'创建