Laravel为属性返回null,返回时显示正常

时间:2016-12-20 15:54:32

标签: php laravel

我的控制器中有以下代码:

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

1 个答案:

答案 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,

我可以继续写作,但我不知道我是否有任何意义。如果您有更多问题,请随时提出。