【问题标题】:Unable to access property of eloquent model query result无法访问 eloquent 模型查询结果的属性
【发布时间】:2020-06-02 17:03:14
【问题描述】:

我遇到了我认为常见的问题,但我没有找到相关的解决方案。

在我的 Laravel 应用程序中,我在两个模型之间设置了关系:BarterReview 和 BarterReviewFeedback。

BarterReview.php

public function barterReviewFeedback () {
    return $this->hasOne(BarterReviewFeedback::class, 'barter_review_id');
}

BarterReviewFeedback.php

public function barterReview () {
    return $this->belongsTo(BarterReview::class);
}

以下返回一个 BarterReview 以及关联的 BarterReviewFeedback

$review = \App\BarterReview::with('barterReviewFeedback')->find(1);
return $review;

格式化后的结果 ($review) 如下所示:

{
  "id": 1,
  "created_at": "2020-04-06T20:13:15.000000Z",
  "updated_at": "2020-04-06T20:13:15.000000Z",
  "rating": 5,
  "comment": "Five out of Five!",
  "user_id": 2,
  "barter_id": 1,
  "barter_review_feedback": {
    "id": 3,
    "created_at": "2020-06-02T16:34:41.000000Z",
    "updated_at": "2020-06-02T16:34:41.000000Z",
    "barter_review_id": 1,
    "user_id": 1,
    "content": "test"
  }
}

问题是我无法访问对象内部的“barter_review_feedback” - $review->barter_review_feedback 不显示任何内容。

此外,尝试直接访问 $review->barter_review_feedback 内部的属性(例如 $review->barter_review_feedback->id)会产生以下错误:Trying to get property 'id' of non-object

关于为什么会这样的任何想法?

【问题讨论】:

    标签: laravel eloquent model eloquent-relationship


    【解决方案1】:

    你可以像这样访问关系

    $review->barterReviewFeedback->id
    

    因为你们的关系是barterReviewFeedback 而不是barter_review_feedback

    【讨论】:

    • 我可以这样做,但这不会消除使用::with('barterReviewFeedback) 的意义吗?我不应该能够使用密钥本身而不是关系来访问对象吗?
    • 使用snack_case改变你的关系,你可以使用key本身访问关系。 public function barterReviewFeedback () { return $this->hasOne(BarterReviewFeedback::class, 'barter_review_id'); } 到 ,public function barter_review_feedback () { return $this->hasOne(BarterReviewFeedback::class, 'barter_review_id'); }
    • 该关系已经通过::with('barterReviewFeedback') 调用,我只想访问返回的$review 对象上的属性。我以前从未遇到过这种方法的问题。
    • 您可以像这样访问对象的属性,$review。 $review->id, $review->rating, $review->comment, $review->barterReviewFeedback->id, $review->barterReviewFeedback->barter_review_id
    • 重点是当访问 Eloquent 关系作为属性时,关系数据是“延迟加载”的。这意味着在您第一次访问该属性之前,不会实际加载关系数据。但是,Eloquent 可以在查询父模型时“预先加载”关系。急切加载缓解了 N + 1 查询问题。 laravel.com/docs/7.x/eloquent-relationships#eager-loading
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-04
    • 2017-04-18
    • 1970-01-01
    • 2019-03-09
    • 1970-01-01
    相关资源
    最近更新 更多