参考课程内容,完成后台文章列表及分页功能
文章列表功能的实现:
数据分页最简单的是使用“查询构造器”或 Eloquent query 的 paginate 方法。
paginate 方法根据用户浏览的当前页码,自动设置恰当的偏移量 offset 和限制数 limit。
默认情况下,HTTP 请求中的 page 查询参数值被当作当前页的页码。Lavarel 自动侦测该值,并自动将其插入到分页器生成的链接中。
Lavarel5.8 无法高效地实现使用了 groupBy 语句的分页操作。如果需要使用对使用了 groupBy 的结果集分页,需要手工查询数据库并创建分页。
基本用法
- 指定要在每页显示 10 条数据:
$users = DB::table('users')->paginate(10);
- 如果只在视图中简单地显示『下一页』和『上一页』链接,则可以使用 simplePaginate 方法执行更高效地查询。这在数据很多且不需要显示每页的页码时非常有用:
$users = DB::table('users')->simplePaginate(10);
- 还可以对 Eloquent 查询结果进行分页:
$users = App\User::paginate(10);
- 在 Eloquent 分页中使用 simplePaginate 方法:
$users = User::where('votes', '>', 100)->simplePaginate(10);
- 在查询中可以设置诸如 where 语句的其它约束:
$users = User::where('votes', '>', 100)->paginate(10);
- 手动创建分页可以通过创建 Illuminate\Pagination\Paginator 或
Illuminate\Pagination\LengthAwarePaginator 实例来实现:
Paginator 类不需要知道结果集的总数;
LengthAwarePaginator 接受和 Paginator 几乎相同的参数;不过,它会计算结果集的总数。
调用 paginate 方法时,会得到 Illuminate\Pagination\LengthAwarePaginator 实例。
调用 simplePaginate 方法,得到的是Illuminate\Pagination\Paginator 实例 - 得到结果后,可以使用 Blade 显示数据、渲染分页链接:
<div class="container">
@foreach ($users as $user)
{{ $user->name }}
@endforeach
</div>
{{ $users->links() }}
- withPath 方法允许你在生成分页链接时自定义 URI:
$users = App\User::paginate(15); $users->withPath('custom/url');
- 可以使用 appends 方法,向分页链接中添加查询参数:
{{ $users->appends(['sort' => 'votes'])->links() }}
- 可以设定在分页器的 “窗口” 的每一侧显示多少个附加链接。默认情况下,主分页链接的每侧显示三个链接。可以使用 onEachSide 方法改变这个数值:
{{ $users->onEachSide(5)->links() }}
- 默认情况下,渲染视图显示的分页链接样式与 Bootstrap CSS 框架兼容。如果你不使用
Bootstrap,可以定制自己的视图来渲染这些链接:{{ $paginator->links('view.name', ['foo' => 'bar']) }}
- 自定义分页视图的最简方法是使用 vendor:publish 命令将它们输出到 resources/views/vendor 文件夹:
php artisan vendor:publish --tag=laravel-pagination
- 如果想要定义不同的文件作为默认分页视图,需要在 AppServiceProvider 中使用分页器的 defaultView 和 defaultSimpleView 方法:
use Illuminate\Pagination\Paginator; public function boot() { Paginator::defaultView('view-name'); Paginator::defaultSimpleView('view-name'); }
代码实现
```php
<?php
namespace App\Http\Controllers\Admins;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
// 内容管理
class Content extends Controller {
// 内容列表
public function index(Request $req) {
// 取出type对应的字段名称(与视图中的选项一一对应)
$dbTitle = [0 => 'title', 1 => 'title', 2 => 'cate_id', 3 => 'author', 4 => 'status'];
//查询参数:
$type = (int) ($req->type);
// $wd = ($type==4)?strtotime(trim($req->wd)):trim($req->wd);
$wd = trim($req->wd);
// 给分页组件传参数appends
$appends = ['type' => $type, 'wd' => $wd];
//搜索符合条件的数据
$data = DB::table('xpcms_article')->where($dbTitle[$type], 'like', '%' . $wd . '%')->pages(2, $appends);
// 构造data参数,传给视图
$data['type'] = $type;
$data['wd'] = $wd;
return view('admins/content/index', $data);
}
public function add() {
return view('admins/content/add', $data);
}
}
```