Как сделать разбивку на страницы для раздела обзоров/комментариев поста в компоненте livewire

Следующий код будет отображать обзоры для каждого сообщения и позволит пользователю сделать обзор

То, что я хочу сделать, это разбить на страницы, где обзоры/комментарии зацикливаются в компоненте.

Для начала, вот моя функция отображения PostsController для получения сообщений.

    public function show($id)
    {
        //defining out post object
        $post = Post::find($id);
        
        return view('posts.show')->with('post', $post);
    }

Далее, вот мой файл show.blade с компонентом livewire

  <!-- livewire posts component -->
  <livewire:cafe-review-section :post = "$post" />
        

Далее, вот мой компонент - компонент показывает все комментарии/отзывы к сообщению, а также форму для размещения отзыва/комментария.

<div>
    <!-- show comment form -->
    <form wire:submit.prevent = "postReview" action = " " method = "post">
        @csrf
        <textarea wire:model.defer = "cafeReview" required name = "cafeReview" id = "" cols = "30" rows = "4"
                  placeholder = "Type review here"
        ></textarea>

        @error('comment')
        <p>{{ $message }}</p>
        @enderror

        <button type = "submit" class = "btn btn-primary">
            <div  wire:loading wire:target = "postReview" class = "spinner-border" role = "status">
                <span class = "visually-hidden">Loading...</span>
            </div>
            <span>post comment</span>
        </button>
    </form>

    <!-- here is where we will display a list of comments for the post-->
    @if (count($post->cafeReviews) > 0)
        @foreach($post->cafeReviews->sortDesc() as $comm)
            <div class = "d-flex bd-highlight" style = "background-color: #FAF0E6; margin-bottom: 1%; border-radius: 20px; padding-top: 1%; padding-bottom: 2%;">
                <div class = "p-2 flex-shrink-1 bd-highlight">
                    <img style = "width: 60px; height: 60px; vertical-align: middle" src = "/css/img/user.png" alt = "avatar">
                </div>
                <div class = "p-2 w-100 bd-highlight">
                    <div class = "flex items-center">
                        <div>Posted by: <b>{{ $comm->username }}</b></div>
                        <hr>
                        <div class = "text-gray-700 mt-2">{{ $comm->content }}</div>
                    </div>
                    <div class = "d-flex" style = "margin-top: 3%; padding-right: 1%;">
                        <div class = "ms-auto">
                            {{ $comm->created_at->diffForHumans() }}
                        </div>
                    </div>
                </div>
            </div>
        @endforeach
    @else
        <p>no reviews</p>
    @endif
</div>

Далее, вот мой класс livewire

<?php

namespace App\Http\Livewire;

use App\Models\CafeReview;
use App\Models\Post;
use Livewire\Component;
use RealRashid\SweetAlert\Facades\Alert;

class CafeReviewSection extends Component
{

    public $post;

    //keeping track of review with sate
    public $cafeReview;

    //defining our validation rules
    protected $rules = ([
        'cafeReview' => 'required|min:4'
    ]);

    //we dont actually need this as livewire knows already
    public function mount(Post $post)
    {
        $this->post = $post;

    }

    public function postReview()
    {
        //validating our comment state when we submit
        sleep(1);
        $this->validate();
        
        CafeReview::create([
            'post_id' => $this->post->id,
            'user_id' => auth()->user()->id,
            'username' => auth()->user()->username,
            'content' => $this->cafeReview,
        ]);

        $this->post->refresh();

        $this->cafeReview = '';

    }

    public function render()
    {
        return view('livewire.cafe-review-section');

    }
}

Эй, спасибо за проверку, это не настоящие сообщения, которые я хочу разбить на страницы, а обзоры, основанные на них. Кажется, я не могу найти, как это сделать из документов, вот как я сейчас зацикливаю обзоры сообщений в компоненте @foreach($post->cafeReviews->sortDesc() as $comm) я новичок в livewire, поэтому приношу свои извинения за не полное понимание этого

jacklove315 19.12.2020 17:13
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
2
520
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы будете следовать документам livewire для разбивки на страницы, вам будет легко добавить их в свое представление.

<!-- here is where we will display a list of comments for the post-->
@forelse ($reviews as $review)
  <div class = "d-flex bd-highlight" style = "background-color: #FAF0E6; margin-bottom: 1%; border-radius: 20px; padding-top: 1%; padding-bottom: 2%;">
    <div class = "p-2 flex-shrink-1 bd-highlight">
      <img style = "width: 60px; height: 60px; vertical-align: middle" src = "/css/img/user.png" alt = "avatar">
    </div>
    <div class = "p-2 w-100 bd-highlight">
      <div class = "flex items-center">
        <div>Posted by: <b>{{ $comm->username }}</b></div>
        <hr>
        <div class = "text-gray-700 mt-2">{{ $comm->content }}</div>
      </div>
      <div class = "d-flex" style = "margin-top: 3%; padding-right: 1%;">
        <div class = "ms-auto">
          {{ $comm->created_at->diffForHumans() }}
        </div>
      </div>
    </div>
  </div>
@empty
  <p>no reviews</p>
@endforelse
<!-- pagination links -->
{!! $reviews->links() !!}
<?php

namespace App\Http\Livewire;

use App\Models\CafeReview;
use App\Models\Post;
use Livewire\Component;
// WithPagination Trait
use Livewire\WithPagination;
use RealRashid\SweetAlert\Facades\Alert;

class CafeReviewSection extends Component
{
    // withPagination Trait
    use WithPagination;

    public $post;

    //keeping track of review with sate
    public $cafeReview;

    //defining our validation rules
    protected $rules = ([
        'cafeReview' => 'required|min:4'
    ]);

    //we dont actually need this as livewire knows already
    public function mount(Post $post)
    {
        $this->post = $post;
    }

    public function postReview()
    {
        //validating our comment state when we submit
        sleep(1);
        $this->validate();

        // create review through post->cafeReviews relationship
        $this->post->cafeReviews()->create([
            'user_id' => auth()->user()->id,
            'username' => auth()->user()->username,
            'content' => $this->cafeReview,
        ]);

        // Reset pagination after creating new review
        $this->resetPage();

        $this->cafeReview = '';
    }

    public function render()
    {
        // Append paginated reviews to view
        $reviews = $this->post->cafeReviews()->latest()->paginate(10);

        return view('livewire.cafe-review-section', compact('reviews'));
    }
}

Другие вопросы по теме