라라벨 페이지네이션은 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>
만약 글 순서를 내림차순으로 바꾸고 싶다면
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'));
}
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
위 사진을 보시면 세 번째 인자로 페이지 이름을 받는데 기본이 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 |
댓글