【问题标题】:Laravel - foreach loop returns Trying to get property of non-objectLaravel - foreach 循环返回试图获取非对象的属性
【发布时间】:2017-08-20 14:16:44
【问题描述】:

我有一组数组 (18),它们都有关系 - question

获取数据的函数:

 $auditResults = Audit::where('audit_id', $id)
     ->with('question', 'question.auditQuestion')
     ->get();

在问题数组中,我可以看到我想要访问的属性。当我尝试访问它时,我得到一个Trying to get property of non-object

收藏:

Collection {#407 ▼
  #items: array:18 [▼
    0 => Audit {#411 ▶}
    1 => Audit {#412 ▶}
    2 => Audit {#413 ▶}
    ... shortened for brevity's sake
    14 => Audit {#425 ▶}
    15 => Audit {#426 ▶}
    16 => Audit {#427 ▶}
    17 => Audit {#428 ▶}
  ]
}

Audit的输出:

@foreach($auditResults as $answer)
    {{$answer}}
@endforeach

{  
       "id":1,
       "audit_id":1,
       "audit_questions_details_id":2,
       "question":{  
          "id":2,
          "audit_question_id":2,
          "question_number":1,
          "comment":1,
          "header":0,
          "created_at":"2017-03-27 12:16:50",
          "updated_at":"2017-03-27 12:16:50",
          "audit_question":{  
             "id":2,
             "audit_detail_id":1,
             "question":"Lorum Ipsum Dorum",
             "created_at":"2017-03-27 12:16:50",
             "updated_at":"2017-03-27 12:16:50"
          }
       },
       "score":null,
       "comment":null,
       "created_at":null,
       "updated_at":null
    }

如果我接着访问问题关系:

@foreach($auditResults as $answer)
    {{$answer->question}}
@endforeach

它只输出一个数字(我不确定它实际上是什么!,因为我希望它输出问题关系):

1
2
3
4

为什么这只是输出一个数字,而应该输出问题数组本身,如上所示?

当我尝试访问question 关系时显示错误:

@foreach($auditResults as $answer)
    {{$answer->question->id}}
@endforeach

审计模型:

class Audit extends Model
{
    protected $fillable = [
        'audit_id', 'audit_questions_details_id', 'question', 'score', 'comment'
    ];

    public function auditScore()
    {
        return $this->belongsTo('App\AuditScore', 'id', 'audit_id');
    }

    public function question(){
        return $this->belongsTo(AuditQuestionDetail::class, 'audit_questions_details_id');
    }

}

审计模型数据:

AuditQuestionDetail 模型:

class AuditQuestionDetail extends Model
{
    protected $table = 'audit_questions_details';

    protected $fillable = [
        'audit_question', 'question_number', 'comment',
    ];

    public function auditQuestion()
    {
        return $this->hasOne(AuditQuestion::class, 'id', 'audit_question_id');
    }

    public function score()
    {
        return $this->hasMany(Audit::class);
    }
}

非常感谢。

【问题讨论】:

  • 请显示您的模型Auditquestion 的关系,可能还有模型Question
  • @AlexanderReznikov - 非常感谢,我已经更新了描述。
  • 谢谢,但我想查看您的模型类 Audit 的属性。可能是你有公共类属性question,它取代了关系question
  • 抱歉,我添加了每个模型的数据/模式的屏幕截图。我希望这会有所帮助。
  • 我相信@AlexanderReznikov 要求提供审计模型中的所有代码,而不是数据库表中的所有列,因为也许你有一些名为“问题”的类变量。但我可能错了。

标签: php laravel foreach laravel-5.4


【解决方案1】:

我敢肯定,我发现了你的问题:你的表中有 question 字段用于模型 Audit,因此,由于某些原因,Laravel 将此字段优先于具有相同名称 question 的关系。只需尝试重命名模型中的关系Audit

例如,改变这个

public function question(){
    return $this->belongsTo(AuditQuestionDetail::class, 'audit_questions_details_id');
}

关于这个:

// I know this isn't the best name, just for the test purposes
public function rquestion(){
    return $this->belongsTo(AuditQuestionDetail::class, 'audit_questions_details_id');
}

然后尝试:

@foreach($auditResults as $answer)
    {{$answer->rquestion}}
@endforeach

如果您在此 foreach 中看到的不仅仅是数字,还有模型 AuditQuestionDetail 实例的 JSON,那么您可以使用此关系中的任何可用字段:

@foreach($auditResults as $answer)
    {{$answer->rquestion->id}}
@endforeach

【讨论】:

  • 到目前为止一切顺利!它现在返回{"id":2,"audit_question_id":2,"question_number":1,"comment":1,"header":0,"created_at":"2017-03-27 12:16:50","updated_at":"2017-03-27 12:16:50","audit_question":{"id":2,"audit_detail_id":1,"question":"LORUM IPSUM...","created_at":"2017-03-27 12:16:50","updated_at":"2017-03-27 12:16:50"}} 我想访问audit_question 数组,但是使用->audit_question 它返回空白。
  • 是的,我测试了你的情况(通过创建表字段和同名的关系),我的行为是一样的,所以只需重命名你的关系或表字段。
  • 重命名audit_question关系?
  • 不,在你的类 Audit 中重命名方法 public function question。在我的示例中,我将question 重命名为rquestion 方法,因此我可以通过$answer->rquestion->FIELD 获取此关系的任何可用字段。
  • 很高兴听到这个消息。如果我知道您希望从这些关系中得到什么结果,我已准备好帮助您解决有关这种关系的所有问题。 Null 在这种情况下通常意味着 Laravel 无法通过您的关系规则(字段名称)从相关表中找到行。
猜你喜欢
  • 2018-10-13
  • 1970-01-01
  • 2020-01-16
  • 2018-07-14
  • 1970-01-01
  • 1970-01-01
  • 2021-06-30
  • 1970-01-01
  • 2015-09-22
相关资源
最近更新 更多