페이징 원리 및 구현


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">&laquo;</a></li>
<li><a href="?page=1">1</a></li>
<li class="active"><span>2</span></li>
<li class="disabled"><span>&raquo;</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">&laquo;</a></li>
<li class="disabled"><span>&raquo;</span></li>
</ul>

간결한 페이징 모드에서는 전체 데이터 수를 쿼리할 필요가 없으므로 쿼리 성능을 향상시킬 수 있습니다.

페이징 매개변수

주요 페이징 매개변수는 다음과 같습니다.


Parameter Description
list_rows페이지당 수량
페이지현재 페이지
pathurl 경로
queryurl 추가 매개변수
fragmenturl 앵커
var_page페이징 변수


페이징 매개변수는 다음으로 설정할 수 있습니다. 페이징 중에 전달 방법을 호출합니다. 예:

$list = Db::name('user')->where('status',1)->paginate([
    'list_rows'=> 20,
    'var_page' => 'page',
]);

페이징 중에 쿼리 조건을 전달해야 하는 경우 쿼리 매개변수를 사용하여 추가 쿼리 매개변수를 연결할 수 있습니다

사용자 정의 페이징 클래스

필요한 경우 페이징 사용자 정의, 페이징 드라이버를 확장할 수 있습니다.

그런 다음 Provider.php 정의 파일에서

return [
    'think\Paginator'    =>    'app\common\Bootstrap'
];

을 다시 바인딩하세요.