Циклическое выполнение вложенных комментариев в Laravel 8.x

#php #laravel #laravel-blade

Вопрос:

В Laravel 8.x я пытаюсь создать систему комментариев в блоге, которая позволяет вам отвечать на комментарии. Если вы отвечаете на комментарий, комментарию присваивается parent_id значение, соответствующее id комментарию, на который они отвечают. В настоящее время, когда я зацикливаю комментарии с ответами, он выводит ответ только на 1 цикл глубиной, как в примере ниже:

Текущий пример проблемы:

Пользователь1: Случайное сообщение 1..
> Пользователь2: Этот текст является ответом Пользователю 1 на сообщение 1>
Пользователь6: Случайное сообщение 2..
Пользователь7: Случайное сообщение 3..

Чего я пытаюсь достичь:

Пользователь1: случайный пост 1..
> Пользователь2: этот текст является ответом на пост пользователя user1 на 1
>> Пользователь3: этот текст является ответом на пост пользователя user2 на 1
>>> Пользователь4: этот текст является ответом на Пользователь3 на должность 1
>>> User5: этот текст является ответом на Пользователь3 после 1
User6: случайный пост 2..
User7: случайный пост 3..

Мой текущий код

Модель:

 class PostComment extends Model
{
    use HasFactory;

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

Лезвие:

 @foreach ($comments as $comment)

    <p> {{ $comment->user->name }} : {{ $comment->comment }} </p>

    @foreach ($comment->replies as $reply)

        <p> {{ $reply->user->name }} : {{ $reply->comment }} </p>

    @endforeach

@endforeach
 

Теперь, если я добавлю @foreach ($comment->replies as $reply) 4 раза в цикле комментариев, он отобразит ответы.. но, конечно, это непрактично, так как на комментарий может быть неограниченное количество ответов. Надеюсь, вы понимаете, к чему я клоню, я ужасно плохо умею все объяснять.

Любая помощь действительно ценится 🙂

Ответ №1:

создайте два блейд-файла

  1. comment-list.blade.php
  2. child-comment-list.blade.php

В comment-list.blade.php файл

 @if(count((array)$comments))
    @foreach ($comments as $comment)
    
        <p> {{ $comment->user->name }} : {{ $comment->comment }} </p>
    
       @include('child-comment-list',['comments'=>$comment->replies])
    
        @endforeach
@endif
    
 

В child-comment-list.blade.php файл

 @if(count((array)$comments))
 @foreach($comments as $comment)
 
  <p> {{ $comment->user->name }} : {{ $comment->comment }} </p>
   @if(count((array)$comment->replies))

            @include('child-comment-list',['comments'=>$comment->replies])

   @endif
 @endforeach
 

Итак, в вашем текущем файле

 @include('comment-list',['comments'=>$comments]);
 

Комментарии:

1. Вау… невероятно.. это решило мою проблему! Это сработало идеально, большое вам спасибо!