datatables服务端分页

初始化

这样就可以得到一个初始的DataTables
<!--第一步:引入Javascript / CSS (CDN)-->

<!-- DataTables CSS -->
<link rel="stylesheet" type="text/css" href="http://cdn.datatables.net/1.10.21/css/jquery.dataTables.css">

<!-- jQuery -->
<script type="text/javascript" charset="utf8" src="http://code.jquery.com/jquery-1.10.2.min.js"></script>

<!-- DataTables -->
<script type="text/javascript" charset="utf8" src="http://cdn.datatables.net/1.10.21/js/jquery.dataTables.js"></script>
<!--第二步:添加如下 HTML 代码-->
<table id="table_id_example" class="display">
    <thead>
        <tr>
            <th>Column 1</th>
            <th>Column 2</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>Row 1 Data 1</td>
            <td>Row 1 Data 2</td>
        </tr>
        <tr>
            <td>Row 2 Data 1</td>
            <td>Row 2 Data 2</td>
        </tr>
    </tbody>
</table>
<!--第三步:初始化Datatables-->
$(document).ready( function () {
    $('#table_id_example').DataTable();
} );

客户端分页

只需把查询数据返回前端,前端自动循环渲染
<!--第二步:添加如下 HTML 代码-->
<table id="table_id_example" class="display">
    <thead>
        <tr>
            <th>ID</th>
            <th>名称</th>
        </tr>
    </thead>
    <tbody>
        @foreach($arr as $val)
        <tr>
            <td>{{$val->id}}</td>
            <td>{{$val->name}}</td>
        </tr>
        @endforeach
    </tbody>
</table>

服务端分页

顾名思义,手动在后端使用代码进行分页
这样主要是为了,减轻数据库一次查询百万条数据的压力和防范前端面对百万条数据进行分页而产生崩溃的问题
$(document).ready( function () {
    $('#table_id_example').DataTable({
        //开启服务端分页
        serverSide:true,
        //分页
        "paging": true,
        "lengthMenu": [10, 25, 50, 75, 100],
        ajax:{
            //访问路由地址
            url:'xxxxx',
            type:'get',
        },
        //指定每一列显示的数据
        columns:[
            //{'data':  '字段名称1', "defaultContent":  "默认值", 'className':  '类名'},
            {data:'id'},
            {data:'title'},
            {data:'created_at'},
            //操作列先占位一下
            {data:'btn'},
        ]
    });
} );
//后端接收数据进行判断
public function list(Request $request){
        //是否为Ajax请求
        if ($request->ajax()){
            // 开启位置
            $start=$request->get('start',0);
            // 获取记录数
            $length=min(100,$request->get('length',10));
            // 获取数据
            $data=Article::offset($start)->limit($length)->get();
            // 获取总数
            $total=Article::count();
            /*
            draw: 客户端调用服务器端次数标识
            recordsTotal: 获取数据记录总条数
            recordsFiltered: 数据过滤后的总数量(和上面记录总数是一样的,无需理会)
            data: 获得的具体数据
            注意:recordsTotal和recordsFiltered都设置为记录的总条数
            */
            $result=[
                'draw'=>$request->get('draw'),
                'recordsTotal'=>$total,
                'recordsFiltered'=>$total,
                'data'=>$data
            ];
            //返回数据
            return $result;
        }
        return view('list');
    }

模型追加字段

解决前面操作列占位,最常见是按钮的添加
protected $appends=['btn'];

    function getBtnAttribute(){
        $id=$this->id;
//        return "<button><a href='xdel?id=$id' >删除</a></button>";
        return "<button value='$id' >删除</button>";
    }

搜索功能

此处是多条件搜索
首先关闭自带搜索功能
"searching": false,
在datatables上准备一个搜索表单

datatables服务端分页

插件实例用一个变量接收

datatables服务端分页

阻止表单默认提交,然后手动调用插件发起ajax提交
function search() {
                    data.ajax.reload();
                    return false;
                }
给datetables添加提交参数,这里必须要用一个函数

datatables服务端分页

组装多条件搜索的条件

datatables服务端分页

然后在查询语句加如下条件即可

datatables服务端分页

排序功能

首先在后端代码加入如下代码段
            //获取排序信息数组
            $orderArr = $request->get('order')[0];

            // 排序索引
            $column = $orderArr['column'];
            // 排序类型 升还是降
            $dir = $orderArr['dir'];
            // 排序字段
            $orderField = $request->get('columns')[$column]['data'];
查询构造器,拼接上排序方法

datatables服务端分页

注意bug

datatables服务端分页

另,前端加入如下内容可实现第二列默认进行倒序排序,其他列禁止排序
"columnDefs": [
                        { "orderable": false, "targets": [0,2,3,4,5,6,7,8,9,10] }
                    ],
                    "order":[[ 1, "desc" ]],
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!