我的控制器中有以下代码:
public function results($module_id){
$module = Module
::with(['userResult','userAnswers','questions.answers'])
->find($module_id);
return $module;
}
在回归期间,我得到以下回复:
{
"id": 2,
"created_at": null,
"updated_at": null,
"title": "Module 2",
"short_description": "Ratione explicabo dicta odio nulla officiis ex est. Aspernatur voluptates accusantium atque nulla explicabo.",
"pass_mark": 0,
"user_result": {
"id": 2,
"created_at": "2016-12-20 14:57:11",
"updated_at": "2016-12-20 14:57:11",
"module_id": 2,
"user_id": 1,
"score": 1
},
"user_answers": [
{
"id": 6,
"created_at": "2016-12-20 14:57:11",
"updated_at": "2016-12-20 14:57:11",
"question_id": 6,
"user_id": 1,
"score": 0,
...
好的,好的。但是当我做以下事情时:
public function results($module_id){
$module = Module
::with(['userResult','userAnswers','questions.answers'])
->find($module_id);
return $module->user_result;
}
我得到一个空白页面。如果我dd($module->user_result)
我得到空。
我做错了什么?
如果有帮助,这里是Module.php
public function questions(){
return $this->hasMany("\App\Question")->orderBy('order');
}
public function userResult(){
return $this->hasOne("\App\ModuleResult")->where('user_id', Auth::id());
}
public function userAnswers(){
return $this->hasManyThrough('\App\QuestionResult', '\App\Question');
}
答案 0 :(得分:1)
要获得关系(如userResult
),您必须获取与定义关系的方法名称完全相同的属性(在本例中为$model->userResult
)。当您在序列化的JSON版本中看到JSON输出并试图获取模型中的属性时,您会感到困惑(这是不正确的,因为模型的JSON表示可能绝对是您想要的任何内容)。
当你得到$model->userResult
时,Laravel会意识到userResult
实际上是一种关系(因为你将关系定义为public function userResult()
),并将返回它。因此,如果您尝试获取$model->user_result
,这是一个不存在的属性,也不是关系,那么您只需获得null
。
现在,为什么它在您的JSON中显示为user_result
?正如Devon所说,Laravel在将序列化时将关系转换为下划线。为什么是这样?我可以想到这一点:通常,数据库列(至少在MySQL中)是用" snake_case"编写的,所以为了保持相同的格式,Laravel snake_cases关系名称,它们应该用camelCase编写,因为PHP standards告诉我们将camelCase用于属性,变量和方法(以及其他)。
如果Laravel没有蛇形关系,那么你的JSON会是这样的:
{
"id": 2,
"created_at": null,
"pass_mark": 0,
"userResult": {
"id": 2,
我可以继续写作,但我不知道我是否有任何意义。如果您有更多问题,请随时提出。