페이징 원리 및 구현
Paging 구현
ThinkPHP에는 페이징 구현이 내장되어 있습니다. 데이터에 페이징 출력 기능을 추가하는 것은 매우 간단합니다. Db 클래스 쿼리 중에 paginate 메서드를 직접 호출할 수 있습니다.
// 查询状态为1的用户数据 并且每页显示10条数据 $list = Db::name('user')->where('status',1)->paginate(10); // 把分页数据赋值给模板变量list View::assign('list', $list); // 渲染模板输出 return View::fetch();
변경할 수도 있습니다. 코드:
// 查询状态为1的用户数据 并且每页显示10条数据 $list = User::where('status',1)->paginate(10); // 把分页数据赋值给模板变量list View::assign('list', $list); // 渲染模板输出 return View::fetch();
템플릿 파일의 페이징 출력 코드는 다음과 같습니다.
<div> <ul> {volist name='list' id='user'} <li> {$user.nickname}</li> {/volist} </ul> </div> {$list|raw}
페이징 출력의 템플릿 변수를 별도로 할당할 수도 있습니다
// 查询状态为1的用户数据 并且每页显示10条数据 $list = User::where('status',1)->paginate(10); // 获取分页显示 $page = $list->render(); // 模板变量赋值 View::assign('list', $list); View::assign('page', $page); // 渲染模板输出 return View::fetch();
템플릿 파일의 페이징 출력 코드
<div> <ul> {volist name='list' id='user'} <li> {$user.nickname}</li> {/volist} </ul> </div> {$page|raw}
기본적으로 생성된 페이징 출력은 전체 페이징 데이터와 상위 및 하위 페이지 번호가 포함된 기능입니다. 페이징 스타일은 생성된 기본 페이징 출력 코드를 통해서만 수정하면 됩니다. 전체 페이징은 다음과 같습니다.
<ul class="pagination"> <li><a href="?page=1">«</a></li> <li><a href="?page=1">1</a></li> <li class="active"><span>2</span></li> <li class="disabled"><span>»</span></li> </ul>
총 데이터를 별도로 가져와야 하는 경우
// 查询状态为1的用户数据 并且每页显示10条数据 $list = User::where('status',1)->paginate(10); // 获取总记录数 $count = $list->total(); // 把分页数据赋值给模板变量list View::assign('list', $list); // 渲染模板输出 return View::fetch();
를 사용하여 전달할 수 있습니다. 총 레코드 수
는 총계를 자동으로 계산하지 않고 총 레코드 수 전달을 지원합니다. 예:
// 查询状态为1的用户数据 并且每页显示10条数据 总记录数为1000 $list = User::where('status',1)->paginate(10,1000); // 获取分页显示 $page = $list->render(); // 模板变量赋值 View::assign('list', $list); View::assign('page', $page); // 渲染模板输出 return View::fetch();
UNION 쿼리 및 일부 특별하고 복잡한 쿼리의 경우 이 방법을 사용하여 먼저 총 레코드 수를 별도로 쿼리한 다음 전달하는 것이 좋습니다. 페이징 방법 입력
페이징 후 데이터 처리
모델의 getter를 통해 필드를 추가하는 대신 페이징 클래스 후 데이터의 각 순회 직접 처리를 지원하므로 페이징 후 데이터를 수정하는 데 편리합니다.
$list = User::where('status',1)->paginate()->each(function($item, $key){ $item->nickname = 'think'; });
Db 클래스가 페이징 데이터를 작동하는 경우 각 메서드의 클로저 함수에서 반환 값을 사용해야 합니다. 예:
$list = Db::name('user')->where('status',1)->paginate()->each(function($item, $key){ $item['nickname'] = 'think'; return $item; });
간단한 페이징
단지 페이징 출력만 출력해야 하는 경우 상단 및 하단 페이지에는 다음과 같은 간결한 페이징 코드를 사용할 수 있습니다.
// 查询状态为1的用户数据 并且每页显示10条数据 $list = User::where('status',1)->paginate(10, true); // 把分页数据赋值给模板变量list View::assign('list', $list); // 渲染模板输出 return View::fetch();
간결한 페이징 모드의 출력 코드는 다음과 같습니다.
<ul class="pager"> <li><a href="?page=1">«</a></li> <li class="disabled"><span>»</span></li> </ul>
간결한 페이징 모드에서는 전체 데이터 수를 쿼리할 필요가 없으므로 쿼리 성능을 향상시킬 수 있습니다.
페이징 매개변수
주요 페이징 매개변수는 다음과 같습니다.
Parameter | Description |
---|---|
list_rows | 페이지당 수량 |
페이지 | 현재 페이지 |
path | url 경로 |
query | url 추가 매개변수 |
fragment | url 앵커 |
var_page | 페이징 변수 |
페이징 매개변수는 다음으로 설정할 수 있습니다. 페이징 중에 전달 방법을 호출합니다. 예:
$list = Db::name('user')->where('status',1)->paginate([ 'list_rows'=> 20, 'var_page' => 'page', ]);
페이징 중에 쿼리 조건을 전달해야 하는 경우 쿼리 매개변수를 사용하여 추가 쿼리 매개변수를 연결할 수 있습니다
사용자 정의 페이징 클래스
필요한 경우 페이징 사용자 정의, 페이징 드라이버를 확장할 수 있습니다.
그런 다음 Provider.php 정의 파일에서
return [ 'think\Paginator' => 'app\common\Bootstrap' ];
을 다시 바인딩하세요.