Laravel 显示 post 的最新评论

Laravel display latest comment of a post

我有 table 个话题,我想在索引页上显示该话题的最新评论。到目前为止,我已经 select 编辑了最新的评论并尝试在页面上显示它,但它只显示整体的最新评论,而不是特定 postenter image description here[=19 的最新评论=]

所以我的 ThreadsController 现在看起来像这样,select查看所有评论并首先显示最新的评论。

 public function index()
    {
        $threads = Thread::latest()->paginate(10);
        $latestComment = Comment::latest()->first();
        return view('threads.index', compact('threads', 'latestComment'));
    }

线程模型

public function user()
    {
        return $this->belongsTo(User::class);
    }

    public function comments()
    {
        return $this->morphMany(Comment::class, 'commentable');
    }

评论模型

public function user() {
        return $this->belongsTo(User::class);
    }

    public function thread()
    {
        return $this->belongsTo(Thread::class);
    }

    public function commentable() {
        return $this->morphTo();
    }

那么如何select来自特定线程的最新评论并将其显示在索引中?

编辑:

控制器:

public function index()
    {
        $threads = Thread::latest()->with('comments')->paginate(10);

        return view('threads.index', compact('threads'));
    }

索引blade:

@foreach($threads as $thread)
    {{ $thread->latestComment->user->name }}
@endforeach

评论table迁移

 public function up()
    {
        Schema::create('comments', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->unsignedBigInteger('user_id');
            $table->string('body');

            $table->unsignedBigInteger('commentable_id');
            $table->string('commentable_type');
            $table->timestamps();
        });
    }

您可以创建胎面和评论之间的关系。 然后在 blade 你可以做这样的事情: $thread->comments->latest()->first()

Comment::all()->orderBy('id', 'DESC')->get()

您已经正确定义了 ThreadComment 之间的关系,但是您没有在 ThreadsControllerindex 函数中使用该关系.你只是抓住了最新的 10 Threads 和最近的 Comment,而不是与你的 Thread.

相关的评论

您想要的是获取所有 Threads 并将它们与最新的 Comment 一起传递到您的视图中。

您可以使用 eager loading 将您的 Comment 关系附加到您的模型。

Thread::latest()->with('comments')->paginate(10);

这将获取您最新的 10 个 Threads 以及他们的 Comments。所以在你看来你可以做这样的事情:

@foreach ($threads as $thread)
    {{ $thread->comments()->latest('id')->first()->comment }}
@endforeach

虽然这有效,但有点冗长。因此,您可以做的是将 comments 函数附加到 return 最近的 Comment 作为关系。

class Thread extends Model
{
    use HasFactory;

    public function comments()
    {
        return $this->morphMany(Comment::class, 'commentable');
    }

    public function latestComment()
    {
        return $this->morphOne(Comment::class, 'commentable')->latest('id');
    }
}

这为您提供了访问 Thread 的最新 Comment 的更短方法。

所以回到你的场景;

在你的ThreadsController.php

public function index()
{
  $threads = Thread::latest()->with('latestComment')->paginate(10);
  return view('threads.index', compact('threads'));
}

然后在您的 index.blade.php 文件中

@foreach ($threads as $thread)
  {{-- Access whatever properties you have on your comment --}}
  {{ $thread->latestComment->id }} 
@endforeach