【问题标题】:Can't load Post with Comment in Laravel无法在 Laravel 中加载带有评论的帖子
【发布时间】:2016-12-02 16:12:05
【问题描述】:

这些是关系:

评论模型

class Comment extends Model
{

    /**
     *
     * The comment belongs to the post
     *
     * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
     */
    public function post()
    {
        return $this->belongsTo('App\Post', 'post_id')->with('Post');
    }

}

后模型

class Post extends Model
{


    /**
     *
     * a post has many comments
     *
     * @return \Illuminate\Database\Eloquent\Relations\HasMany
     */
    public function comments()
    {
        return $this->hasMany('App\Comment');
    }

然后尝试检查通过的内容:

$comment = Comment::findOrFail($id);

        return Response()->json($comment);

    }

只检索评论的东西,没有关系,我不明白,它不应该沿着评论急切加载帖子吗?

如果我从模型中删除 ->with('Post'); 并使用

$comment = Comment::findOrFail($id)->load('Post');

帖子已加载,但无论如何它都应该使用 Model 方法。

【问题讨论】:

  • 不,我正在检索一条评论,并且只有一篇与评论相关联的帖子。我不需要任何 foreach。此外,正如我在主要问题中已经写的那样 $comment = Comment::findOrFail($id)->load('Post');随帖子返回评论。
  • 好的,知道了。我认为如果您使用访问器创建虚拟字段,那么您可以轻松找到您的帖子。但是对于海量数据来说需要太多次。

标签: php laravel post load comments


【解决方案1】:

你应该改变

$comment = Comment::findOrFail($id)->load('Post');

$comment = Comment::with('Post')->findOrFail($id);

【讨论】:

  • 有什么区别?结果完全一样。
  • @Chriz74 啊,我明白你的意思了,你不想指定它应该加载 Post 但它应该自动完成,但我不知道这是否可能。
  • 没错。我用其他模型做了它并且它有效。这里不工作。为什么?我不知道。
【解决方案2】:

如果您返回 JSON 对象,则必须执行 Comment::with('Post')... 否则它不会急切加载查询 (https://laravel.com/docs/5.1/eloquent-relationships#eager-loading)

但是,如果您将模型对象传递到视图 return view('welcome', compact('comment')) 的位置,您可以调用 $comment->post 并且有您的 Post 对象,延迟加载。

【讨论】:

  • 我有其他模型,我正在返回一些东西->with('some_relation') 对 json 非常好
  • 这正是我所说的:你必须使用Model::with('relation')
  • "只检索评论的东西,没有关系,我不明白,它不应该急切地沿着评论加载帖子吗?" : 不,不应该。它只能使用“with”进行急切加载。
  • 没错。请阅读代码。在模型中,我正在加载 comment->with('post') 但它不起作用。
  • 抱歉,很难理解你的问题到底是什么。但是,是的,它应该像你所说的那样工作 Comment::with('Post')
【解决方案3】:

如果您希望在获取Comment 时,同时获取相关的Post,只需在Comment 模型中使用以下属性

protected $with = ['post'];

它应该预先加载关联的Post

是的,您需要从您的关系中删除 ->with('post') 部分。它不会做你期望它做的事情。

同时,我建议阅读一下with()load() here 之间的区别

【讨论】:

  • 嗨,谢谢,您建议的方式也可以。您能否提供有关您发布的 protected 方法的解释的链接?另外,您如何解释在用户模型中我有这个:public function collected_item(){ return $this->belongsToMany('App\Collected_item')->with('Item_model', 'Designer'); } 并且它有效?它返回带有关系的collected_item。
  • 是的,它会......但它不会急切加载......关于受保护的方法,我在关注 Model 类时发现了它......我没有知道任何这样的资源...here
  • hm,实际上当我返回一个collected_item 时,我得到了所有的关系('Item_model' 和'Designer')。所以我不明白为什么它不适用于评论..可能是由于不同的关系吗?一个是belongsToMany,另一个是belongsTo
  • 我确定不是因为这个。我认为您在User 模型中完成了一些其他配置。我可能是错的..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-10
  • 1970-01-01
  • 2017-07-29
  • 2019-06-13
  • 2019-08-24
  • 1970-01-01
相关资源
最近更新 更多