본문 바로가기
IT/PHP

Laravel - Pagination

by Sungjun_ 2021. 1. 29.

라라벨 페이지네이션은 Eloquent와 DB를 이용한 방법이 있습니다.

또한 페이지네이터로 생성된  것은 기본적으로 Tailwind CSS와 호환됩니다.

 

 public function index()
    {
        $frees = Free::paginate(10);
        return view('frees.index', compact('frees'));
    }

 

컨트롤러의 index 메소드 부분인데

모델::paginate(숫자)를 해주면 한 페이당 숫자 만큼의 데이터를 가지고 옵니다.

위 코드로 하면 한 페이지당 10개의 데이터를 가지고 옵니다.

 

이렇게 하고 blade 파일에 아래 처럼 입력하면 아래 각 페이지로 이동 가능한 버튼이 생깁니다.

<div>
    {{$frees->links()}}
</div>

 

paginate

 

만약 글 순서를 내림차순으로 바꾸고 싶다면

 public function index()
    {
        $frees = Free::orderBy('id', 'desc')->paginate(10);
        return view('frees.index', compact('frees'));
    }

 

이렇게 orderBy를 써주거나 아래처럼 orderByDesc를 써주면됩니다.

 public function index()
    {
        $frees = Free::orderByDesc('id')->paginate(10);
        return view('frees.index', compact('frees'));
    }

 

desc

 

DB를 이용한 방법도 비슷합니다.

 

public function index()
{
     $frees = DB::table('frees')->orderByDesc('id')->paginate(10);
     return view('frees.index', compact('frees'));
}

 

차이가 있다면 테이블 이름을 사용하는 것입니다.

 

 

페이지네이션을 하다가 생긴 문제가 있었는데

 

이렇게 한 페이지 내에 여러 페이지네이션을 했을 경우입니다.

현재 한 페이지에 댓글과 게시물을 페이지네이션을 했는데

댓글 두 번째 페이지로 간다면 댓글뿐만 아니라, 아래에 있는 게시물 목록도 두 번째 페이지로 이동합니다.

이유는 페이지네이터를 사용하면 파라미터 이름을 page로 사용하는데

둘 다 같은 파라미터 이름을 공유해서 생기는 문제입니다.

http://127.0.0.1:8000/frees/1?page=2 <<< 이런 식으로 page를 공유합니다.

 

그래서 라라벨 api문서를 확인해서 paginate 메소드를 확인해봤습니다.

https://laravel.com/api/8.x/Illuminate/Database/Eloquent/Builder.html#method_paginate

 

Illuminate\Database\Eloquent\Builder | Laravel API

class Builder (View source) Traits Properties protected Builder $query The base query builder instance. protected Model $model The model being queried. protected array $eagerLoad The relationships that should be eager loaded. static protected array $macros

laravel.com

 

paginate

 

위 사진을 보시면 세 번째 인자로 페이지 이름을 받는데 기본이 page로 돼있습니다.

그래서 댓글 페이지네이션을 할 때 세 번째 인자를 따로 주었습니다.

 

$comments = Comment::where('free_id', $id)->paginate(5, ['*'], 'comments');

 

이렇게 commetns라는 이름을 새로 주었고

http://127.0.0.1:8000/frees/1?comments=2 << 페이지 이동 시에 이렇게 됩니다.

 

 

'IT > PHP' 카테고리의 다른 글

Laravel - 이미지 리사이즈  (1) 2021.03.09
Laravel - Scout(검색)  (0) 2021.03.07
Laravel + vue : API(3)  (0) 2021.01.19
Laravel + vue : API(2)  (0) 2021.01.19
Laravel + vue : API(1)  (0) 2021.01.19

댓글