thinkphp5配合datatable插件分页后端处理程序
thinkphp5配合datatable插件分页后端处理程序
第一版DataTable.php v.1.0
<?php
use think\Db;
/**
* DataTable.php.
*/
/**
* datatable结合thinkphp5使用的分页后台处理程序.
*
* @author B.I.T.
* @copyright Copyright (c) 2018-2019, B.I.T.
* @license
*
* @see 初始化
*
* @version v.1.0
*/
class DataTable
{
/**
* 数据库对象
*
* @var objectc
*/
public $_db;
/**
* 表名.
*
* @var string
*/
protected $_table;
/**
* 表格重绘次数.
*
* @var int
*/
protected $_draw;
/**
* 排序的是哪行.
*
* @var int
*/
protected $_order_column; //排序的行
/**
* 排序方式
* asc desc.
*
* @var string
*/
protected $_order_dir; //排序方式 asc desc
/**
* 查询的数据.
*
* @var string
*/
protected $_search = ''; //查询的字符串
/**
* 查询开始的位置.
*
* @var int
*/
protected $_start; //开始的位置
/**
* 每页显示的条目数.
*
* @var int
*/
protected $_length; //查询的长度
/**
* 过滤后的条目数量.
*
* @var integer
*/
protected $_recordsFiltered = 0; //过滤后的条目数量
/**
* 总的条目数量.
*
* @var integer
*/
protected $_recordsTotal = 0; //总的条目数量
/**
* 返回的数据 没用到.
*
* @var [type]
*/
protected $_return; //没用到
/**
* 存放构造函数的第二个参数.
*
* @var [type]
*/
protected $_info; //存放构造函数的第二个参数 /**
* 构造函数 处理datatables发送的数据,用户自定义条件,.
*
* @param array $dataTableGet dataTable前台传递过来的数组
* @param array $info 构造好的数组结构如下
* example array( //表示 select ID AS sum,ID,USERNMAE 其中 sum用来统计数据的总条数
* "select"=array(
* "ID"=>"sum",
* "0"=>'ID',
* "1"=>"USERNAME",
* ),
* "order"=>array( //前台会发送过来根据哪一列排序 接收过来的值就是 键值,对应到数据表中的字段就是值,前台有几个列能够排序这里就需要有几个对应的键值队
* "0"=>"ID",
* "2"=>"USERNAME",
* ),
* "where"=>array( //and和or可以同时调用 但是or是用来做查询的 and则是初始数据的查询条件
* "and"=>array( //表示会查询state=1 and level=2 and (a=1 or a=2) 的数据
* "state"=>'1',
* "level"=>"2",
* "a"=>[1,2]
* ),
*
* 注:"or" 用户搜索的时候存在一个问题,参与搜索查询的列必须为同一类型比如id和name字段就不可以一起搜索会出现输入
* "qwer" sql为 (id like 0 or name like %qwer%)的情况
*
* "or"=>array("ID","USERNAME"), //用户查询的时候回根据这里的参数作为查询的列 例如 当search=root时 就会查询 ID like %root% or USERNAME like %root%
* "or2"=>[ //这里面的会用or连接 几乎很少用 例如下面的数组会变成: a=1 or a=2 or b=2
* a=>[1,2],
* b=>[2]
* ]
* ),
* "join"=>array(
* 'class'=>array('student.class_id','class.id'),
* 'sex'=>array('student.class_id','sex.id')
* )
* )
* @param string $db 数据库对象
*
* @return object this
*/
public function __construct($dataTableGet, $info = array(), $table = '')
{
$this->_init($dataTableGet);
$this->_table = $table;
$this->_db = Db::table($this->_table);
$this->_info = $info;
} /**
* 初始化参数,检查数据格式.
*
* @param array $data datatables发送过来的数据
*/
protected function _init($data)
{
if (isset($data)) {
$this->_draw = isset($data['draw']) ? $data['draw'] : null;
$this->_length = isset($data['length']) ? intval($data['length']) : null;
$this->_start = isset($data['start']) ? intval($data['start']) : null;
$this->_order_column = isset($data['order']['0']['column']) ? intval($data['order']['0']['column']) : null;
$this->_order_dir = isset($data['order']['0']['dir']) ? $data['order']['0']['dir'] : null;
$this->_search = isset($data['search']['value']) ? $data['search']['value'] : null;
}
} /**
* 输出datatables需要的数据格式,还需要打成json的格式才行.
*
* @param bool $debug true 会输出一些调试信息 默认false
*
* @return array atatables需要的数据格式
*/
public function output($debug = false)
{
$data = $this->_info;
if (isset($data['select']) && !empty($data['select'])) {
$selectSql = $this->_getSelectSql($data['select']);
} else {
$selectSql = '*';
}
$this->_db = $this->_db->field($selectSql);
if (isset($data['join']) && !empty($data['join'])) {
foreach ($data['join'] as $key => $value) {
$this->_db = $this->_db->join($key,$value[0].' = '.$value[1]);
}
}
if (isset($data['order']) && !empty($data['order'])) {
$orderSql = $this->_getOrderSql($data['order']);
$this->_db = $this->_db->order($orderSql);
}
if (isset($data['where']) && !empty($data['where'])) {
$and = isset($data['where']['and']) && !empty($data['where']['and']) ? $data['where']['and'] : null;
$or = isset($data['where']['or']) && !empty($data['where']['or']) ? $data['where']['or'] : null;
$or2 = isset($data['where']['or2']) && !empty($data['where']['or2']) ? $data['where']['or2'] : null;
if(!is_null($and)){
foreach ($and as $key => $value) {
if(is_array($value)){
foreach ($value as $k => $v) {
$this->_db = $this->_db->whereOr($key,$v);
}
unset($and[$key]);
}
}
$this->_db = $this->_db->where($and);
}
if(!is_null($or)){
$or_val = '';
for ($i=0; $i < count($or); $i++) {
$or_val .= $i == count($or)-1 ? $or[$i] : $or[$i].'|';
}
if(!is_null($this->_search)&&$this->_search!=''){
$this->_db = $this->_db->where($or_val,'like','%'.$this->_search.'%');
}
}
if(!is_null($or2)){
foreach ($or2 as $key => $value) {
if(!is_array($value)) return false;
foreach ($value as $k => $v) {
$this->_db = $this->_db->whereOr($key,$v);
}
}
}
}
if (isset($this->_start) && isset($this->_length)) {
$this->_db = $this->_db->limit($this->_start,$this->_length);
}
if ($debug) {
var_dump($this->_db->fetchSql(true)->select());die;
}
$db1 = clone $this->_db;
$info = $this->_db->select();
$this->_recordsTotal = $db1->count();
$this->_recordsFiltered = $this->_recordsTotal;
return array(
'draw' => intval($this->_draw),
'recordsTotal' => intval($this->_recordsTotal),
'recordsFiltered' => intval($this->_recordsFiltered),
'data' => $info,
);
} /**
* 当前台需要排序的时候会根据需要排序的列对应的表中的值排序
* 构建排序的sql.
*
* @param array $data 构造函数第二个参数order部分
*
* @return string 排序部分的sql语句
*/
protected function _getOrderSql($data)
{
$sql = '';
if (is_array($data)) {
foreach ($data as $key => $value) {
if ($key == $this->_order_column) {
$sql = "{$value} ".$this->_order_dir;
break;
}
}
}
return $sql;
} /**
* 构建select部分的sql语句.
*
* @param array $data 构造函数第二个参数select部分
*
* @return string select部分的语句
*/
protected function _getSelectSql($data)
{
$list = array();
foreach ($data as $key => $value) {
if (is_numeric($key)) {
array_push($list, $value);
} else {
array_push($list, $key.' AS '.$value);
}
}
if (!empty($list)) {
$selectSql = implode(',', $list);
} else {
$selectSql = '*';
}
return $selectSql;
}
}
控制器类调用
<?php namespace app\index\controller; use think\Controller;
use think\Db;
use DataTable; class Index extends Controller
{
public function list()
{
return view('index/list');
} public function list_ajax()
{
$get = input('get.');
$where = [];
$data['select'] = ['think_user.id'=>'t_id','think_user.uname','think_user.upwd','think_banji.banji_name','think_user.status'];
$data['order'] = ['0'=>'think_user.id','1'=>'think_user.uname','2'=>'think_user.upwd','3'=>'think_banji.banji_name'];
// $data['where']['and'] = ['think_user.status'=>1,'think_user.id'=>[1,2]];
$data['where']['or'] = ['think_user.uname','think_user.upwd'];
$data['join'] = [
'think_banji'=>['think_user.banji_id','think_banji.id'],
];
$a = new DataTable($get, $data, 'think_user');
return $a->output();
}
}
thinkphp5配合datatable插件分页后端处理程序的更多相关文章
- jquery.datatable插件从数据库读取数据
一.分页 分页的基本思想是根据datatable的页码及每页显示的行数,将数据从数据库分段提出,然后再填充到表格中,以达到分页的效果. 这里需要用到datatable插件的几个属性: "sE ...
- JQuery DataTable插件
参考文件: http://blog.csdn.net/xuechongyang/article/details/8424897 http://blog.csdn.net/llhwin2010/arti ...
- 分享在MVC3.0中使用jQuery DataTable 插件
前不久在网络上看见一个很不错的jQuery的DataTable表格插件.后来发现在MVC中使用该插件的文章并不多.本文将介绍在MVC3.0如何使用该插件.在介绍该插件之前先简单介绍一下,推荐该插件的原 ...
- DataTable插件通过js导出Excel
$('#myTab').DataTable( { serverSide: false,//分页,取数据等等的都放到服务端去. true为后台分页,每次点击分页时会请求后台数据,false为前台分页 d ...
- datatable插件使用小记
经验,是前行路上,磕磕碰碰,不断探索,最终留下的结晶:亦是下一次,快速高效,寻求到结果的快捷方式. datatable插件具体可参考: 官网:http://datatables.club/ 参数说明: ...
- DataTable插件报错:Uncaught TypeError: Cannot read property 'style' of undefined
DataTable插件报错:Uncaught TypeError: Cannot read property 'style' of undefined 原因:table 中定义的列和aoColumns ...
- dataTable插件锁表头和锁列的教程
源代码下载 我的同事让我帮忙给弄个锁头锁列的插件.结果找到大名鼎鼎的jquery dataTable插件. 今天我们来介绍不常用的功能:dataTable插件锁表头和锁前两列 由于是移动前端.我们不考 ...
- 将DataTable进行分页并生成新的DataTable
/// <summary> /// 将DataTable进行分页并生成新的DataTable /// </summary> /// <param name="d ...
- 【spring boot】14.spring boot集成mybatis,注解方式OR映射文件方式AND pagehelper分页插件【Mybatis】pagehelper分页插件分页查询无效解决方法
spring boot集成mybatis,集成使用mybatis拖沓了好久,今天终于可以补起来了. 本篇源码中,同时使用了Spring data JPA 和 Mybatis两种方式. 在使用的过程中一 ...
随机推荐
- python selenium自动化常用关键字
工具安装: 1.安装python 2.安装selenium库(dos命令下进入selenium-2.53.2存放路径,执行pip install selenium-2.53.2) 3.将浏览器驱动放到 ...
- [NOIp2009] luogu P1071 潜伏者
翘课间操和体育课来水博客. 题目描述 CCF的题面贼长,但貌似除了背景以外,每句话都删不掉.不写啦,反正也是Ctrl C的. Solution 显然这是一道码农题. #include<cstdi ...
- Python开发【第六篇】循环语句
while 语句 注意事项:1.要控制循环的真值表达式的值来防止死循环 2.通常用真值表达式内的循环变量来控制循环条件 3.通常在语句内部改变循环变量 4.只要是语句都可以互相嵌套 whi ...
- 解析fiddler返回的部分数据。
1.通过抓包获取的数据,里面包含的哪些内容是需要我们去关注的? 2.首先上图. 3.图片说明: 此图片中是利用豆瓣API提供的接口实现返回数据.内容与抓包返回的内容格式一致 url:https://a ...
- 百万年薪python之路 -- MySQL数据库之 Navicat工具和pymysql模块
一. IDE工具介绍(Navicat) 生产环境还是推荐使用mysql命令行,但为了方便我们测试,可以使用IDE工具,我们使用Navicat工具,这个工具本质上就是一个socket客户端,可视化的连接 ...
- Java8系列 (二) Stream流
概述 Stream流是Java8新引入的一个特性, 它允许你以声明性方式处理数据集合, 而不是像以前的指令式编程那样需要编写具体怎么实现. 比如炒菜, 用指令式编程需要编写具体的实现 配菜(); 热锅 ...
- vue-class-component使用Mixins
vue-class-component提供了mixinshelper函数,以类样式的方式使用mixins.通过使用mixins帮助程序,TypeScript可以推断mixin类型并在组件类型上继承它们 ...
- Shiro权限管理框架(四):深入分析Shiro中的Session管理
其实关于Shiro的一些学习笔记很早就该写了,因为懒癌和拖延症晚期一直没有落实,直到今天公司的一个项目碰到了在集群环境的单点登录频繁掉线的问题,为了解决这个问题,Shiro相关的文档和教程没少翻.最后 ...
- django-Views之常见的几种错误视图代码(三)
1.404 page not found(找不到对应的页面) 2.500 server error(服务器错误) 3.400 bad request(无效的请求) 4.403 HTTP forbidd ...
- Java新特性 5、6、7、8、9、10、11、12、13
文章转载于:https://www.cnblogs.com/hepengju/p/11595102.html 项目地址:https://github.com/hepengju/java-new-fea ...