Как показать все комментарии и ответы, сгруппированные по похожим постам - PullRequest
0 голосов
/ 01 мая 2019

Я хочу создать группу комментариев на основе аналогичных commentable_id (post) и отображать их.

Моя проблема Я не могу показать каждый ответный комментарий .я просто показываю корень комментария, а не для ответа .

мой контроллер для отображения комментариев

public function index()
{
    $mycomments = Comment::where('user_id', '=', Auth::user('member')->id)
                            ->groupBy('commentable_id')
                            ->with('replies')
                            ->orderBy('created_at', 'desc')
                            ->get();

    return view('frontendblog.memberlogin.home', compact('mycomments'));
}

и моя модель комментариев

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

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


public function myreplyfrom()
{
    return $this->belongsTo(Comment::class,'parent_id');
}

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

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

моя таблица комментариев нравится этоmy comment table

мой код в поле зрения

@foreach($mycomments as $comment)

                        <a href="{{ route('blog.show', $comment->commentable->slug) }}#comments"> <p>Title Post->{{ $comment->commentable->title }}</p> </a>
                        <p> Author of Post-> {{ $comment->commentable->author->name }} </p>
                        <p>Comment->{{ $comment->body }}</p>
                        @if($comment->myreplyfrom)
                            <p> Reply from Comment-> {{ $comment->myreplyfrom->body }} </p>
                        @endif
                        {!! Form::open([
                            'method' => 'POST',
                            'route' => ['comment.destroy',"id_comment" => $comment->id, "id_member" => $comment->user_id]])
                        !!}
                        {!! Form::submit('delete', [
                            'onclick' => 'deleteConfirm()',
                            'id' => 'from1',
                            ])!!}
                        {!! Form::close() !!}
                        <hr/>
                    @endforeach

мой результат как этот

Заголовок сообщения-> Quasi itaque perferendis aut animi magnam incidunt qui debitis et nesciunt acceptnda saepe.

Автор сообщения-> Ильхам Фирман A

Комментарий-> действие 1 (Удалить)


Заголовок сообщения-> Inidunt Provant Aut Atque Qui.

Автор сообщения-> Ильхам Фирман A

Комментарий-> woww (Удалить)

ожидаемый результат

Заголовок сообщения-> Quasi itaque perferendis aut animi magnam incidunt qui debitis et nesciunt acceptnda saepe.

Автор сообщения-> Ильхам Фирман A

Комментарий-> Действие 1 (Удалить)

Комментарий-> Ответное действие 1 (Удалить)


Заголовок сообщения-> В случае возникновенияaut atque qui.

Автор сообщения-> Ильхам Фирман A

Комментарий-> woww (Удалить)

Комментарий-> sjksjks (Удалить)

Комментарий-> sdsds (Удалить)

Ответы [ 2 ]

1 голос
/ 02 мая 2019

Проблема в этой строке:

->groupBy('commentable_id')

Когда вы группируете по commentable_id, для каждой записи из таблицы комментариев будет приниматься только ОДИН комментарий.

Вы могли бы сделать что-то вроде этого:

// This is a collection of comments grouped by post id, so I rename the variable to $commentsGroupedByPost.
$commentsGroupedByPost = Comment::where('user_id', '=', Auth::user('member')->id)

                            ->with('replies', 'commentable')
                            ->orderBy('created_at', 'desc')
                            ->get()
                            ->groupBy('commentable_id');

Тогда из вида:

@foreach($commentsGroupedByPost as $postId => $comments)
    <a href="{{ route('blog.show', $comments->first()->commentable->slug) }}#comments">
        <p>Title Post->{{ $comments->first()->commentable->title }}</p> 
    </a>
   <p> Author of Post-> {{ $comments->first()->commentable->author->name }} </p>

   @foreach($comments as $comment)

        <p>Comment->{{ $comment->body }}</p>
        @foreach($comment->replies as $reply)
            <p> Reply from Comment-> {{ $reply->body }} </p>
        @endforeach
        {!! Form::open([
            'method' => 'POST',
            'route' => ['comment.destroy',"id_comment" => $comment->id, 
            "id_member" => $comment->user_id]])
        !!}
        {!! Form::submit('delete', [
            'onclick' => 'deleteConfirm()',
            'id' => 'from1',
        ])!!}
        {!! Form::close() !!}
    @endforeach
    <hr/>
@endforeach
0 голосов
/ 01 мая 2019

Я не уверен на 100% в том, чего вы пытаетесь достичь, но я думаю, что вы пытаетесь получить только первый комментарий / ответ?

Если это так, попробуйте это:

$mycomments = Comment::where('user_id', '=', Auth::user('member')->id)
        ->groupBy('commentable_id')
        ->with(['replies', function($query) {
            $query->latestFirst();
        }])
        ->get();

Я не уверен, что делает ваш метод lastFirst (), но добавление, которое я добавил, должно дать вам первый экземпляр ответа / комментариев.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...