【Laravel】$post->commentsの中にログインユーザーのコメントがあるかどうか判定

【Laravel】$post->commentsの中にログインユーザーのコメントがあるかどうか判定

たとえば以下のようなケースで使えるサンプルコードです。

  • $post->commentsで、その投稿についているコメントを取得する。 さらに、その中に自分(ログインユーザー)のコメントがあるかどうか判定したい
  • $product->reviewsで、その商品についているレビューを取得する。 さらに、その中に自分(ログインユーザー)のレビューがあるかどうか判定したい

Modelのリレーション定義

投稿(post)とコメント(comment)を例にします。

■ Post.php

// Post.php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    public function comments()
    {
        return $this->hasMany(Comment::class);
    }
}

■ Comment.php

// Comment.php

namespace App;

use Illuminate\Database\Eloquent\Model;

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

ログインユーザーのものがあるか判定

use Illuminate\Support\Facades\Auth;

// ...

// $postは取得した投稿オブジェクト
$comments = $post->comments;

foreach ($comments as $comment) {
    // コメントがログインユーザーのものかどうかを判断
    $isCurrentUserComment = Auth::check() && $comment->user_id === Auth::id();

    // $isCurrentUserCommentを使って何かしらの処理を行う
}

Blade上で何らかの条件分岐を行うならば、以下のようになります。

@php
    $userHasCommented = $post->comments->where('user_id', Auth::id())->first();
@endphp

@if($userHasCommented)
    <div>コメント済み</div>
@endif