2017-02-01 9 views
0

数日前、私はユーザーが投稿にコメントできるウェブサイトを見ました。他のユーザーはそれに返信することができます。リプレイには以下の例のスクリーンショットのような返事を付けることができます。enter image description herelaravel雄弁なネストされたコメントと返信

だから私は試してみると思っていましたが、何とかそれを理解できませんでした。 は、ここに私のデータベースには、これは完全にコメントや返信を返すモデル

Schema::create('comments', function (Blueprint $table) { 
      $table->increments('id'); 
      $table->unsignedInteger('user_id'); 
      $table->unsignedInteger('post_id'); 
      $table->unsignedInteger('reply_id')->default(0); 
      $table->text('body'); 
      $table->timestamps(); 
     }); 

関係

class Comment extends Model 
{ 
    protected $fillable = [ 
     'user_id', 
     'post_id', 
     'reply_id', 
     'body' 
    ]; 

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

    public function post() 
    { 
     return $this->belongsTo(Post::class); 
    } 

    public function replies() 
    { 
     return $this->hasMany(Comment::class,'reply_id','id'); 
    } 
コントローラで

$comments = Comment::with('replies')->where('reply_id','=',0)->get(['id','reply_id','body']); 
    return response($comments); 

に設定されています。しかし、返信の返事があれば、それは現れません。どうやってやるの?提案が必要です。

答えて

2

スワップreply_idnullable()parent_idである。だから、基本的には、コメントに親があるかどうかを知りたい。

Commentモデルでは、自己関係を追加して、parent_idのすべてのコメントを受け取ります。あなたのビューで

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

は、各コメントのループとその回答を入れ子にしていることができ

@foreach($comments as $comment) 
    {{ $comment->content }} 

    @if ($comment->replies) 
     @foreach($comment->replies as $rep1) 
      {{ $rep1->content }} 
      ... 
     @endforeach 
    @endif 
@endforeach