如何获取 $comments->post_id = $post->id with Laravel 的评论?

How to fetch comments where $comments->post_id = $post->id with Laravel?

好的,

所以我想不通这个。 Eloquent 模型对我来说是新的。

我正在尝试获取特定 post 的评论。

这是我的post模型:

<?php
namespace App;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    public function user()
    {
        return $this->belongsTo('App\User'); 
    }

    public function likes()
    {
        return $this->hasMany('App\Like');
    }

    public function comments()
    {
        return $this->hasMany('App\Comment');
    }
}

评论型号:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Comment extends Model
{
    public function user()
    {
        return $this->belongsTo('App\User');
    }
    public function post()
    {
        return $this->belongsTo('App\Post');
    }
}

路线:

public function getDashboard(){
        $posts = Post::orderBy('created_at', 'desc')->get(); // MySQL ORDER BY
        $comments = Comment::orderBy('created_at', 'desc')->get();

        return view('dashboard', ['posts' => $posts], ['comments' => $comments]);
    }

($comments 可能是不必要的?)

查看:

@foreach($posts as $post)

        <article class="post" data-postid=" {{ $post->id }} ">
            <p>{{ $post->body }}</p>
            <div class="info">
                Posted by {{$post->user->first_name}}  on {{ $post->created_at }}
            </div>
</article>

我尝试使用以下方式遍历评论:

@while($comments->post_id = $post->id)

   <p>{{$comments->body}}</p>

@endwhile

我收到一条错误消息 "Undefined property: Illuminate\Database\Eloquent\Collection::$body",即使评论 table 有一个名为 "body" 的列。

@foreach($post->comments as $comment)

是你想要的。您也可以在查询中使用预先加载来加快速度:

Post::with('comments')->orderBy('created_at', 'desc')->get()

由于 $post->user->first_name,您编写代码时创建了多个查询。例如,如果您有 70 个帖子,您的代码将创建 72 个非常糟糕的查询。

最好使用 eager loading 加载带有评论和用户的帖子。此代码将仅创建 3 个查询:

Post::orderBy('created_at', 'desc')
    ->with(['user', 'comments' => function ($q) {
        $q->orderBy('created_at', 'desc');
    }])->get();

然后对集合进行迭代:

@foreach ($posts as $post) {
    <article class="post" data-postid=" {{ $post->id }} ">
    ....
    @foreach ($post->comments as $comment) {
        $comment->content;
    }
}