经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » PHP » 查看文章
thinkphp5配合datatable插件分页后端处理程序
来源:cnblogs  作者:程序媛的明天  时间:2019/11/7 20:45:47  对本文有异议

thinkphp5配合datatable插件分页后端处理程序
第一版DataTable.php v.1.0

  1. 1 <?php
  2. 2 use think\Db;
  3. 3 /**
  4. 4 * DataTable.php.
  5. 5 */
  6. 6 /**
  7. 7 * datatable结合thinkphp5使用的分页后台处理程序.
  8. 8 *
  9. 9 * @author B.I.T.
  10. 10 * @copyright Copyright (c) 2018-2019, B.I.T.
  11. 11 * @license
  12. 12 *
  13. 13 * @see 初始化
  14. 14 *
  15. 15 * @version v.1.0
  16. 16 */
  17. 17 class DataTable
  18. 18 {
  19. 19 /**
  20. 20 * 数据库对象
  21. 21 *
  22. 22 * @var objectc
  23. 23 */
  24. 24 public $_db;
  25. 25 /**
  26. 26 * 表名.
  27. 27 *
  28. 28 * @var string
  29. 29 */
  30. 30 protected $_table;
  31. 31 /**
  32. 32 * 表格重绘次数.
  33. 33 *
  34. 34 * @var int
  35. 35 */
  36. 36 protected $_draw;
  37. 37 /**
  38. 38 * 排序的是哪行.
  39. 39 *
  40. 40 * @var int
  41. 41 */
  42. 42 protected $_order_column; //排序的行
  43. 43 /**
  44. 44 * 排序方式
  45. 45 * asc desc.
  46. 46 *
  47. 47 * @var string
  48. 48 */
  49. 49 protected $_order_dir; //排序方式 asc desc
  50. 50 /**
  51. 51 * 查询的数据.
  52. 52 *
  53. 53 * @var string
  54. 54 */
  55. 55 protected $_search = ''; //查询的字符串
  56. 56 /**
  57. 57 * 查询开始的位置.
  58. 58 *
  59. 59 * @var int
  60. 60 */
  61. 61 protected $_start; //开始的位置
  62. 62 /**
  63. 63 * 每页显示的条目数.
  64. 64 *
  65. 65 * @var int
  66. 66 */
  67. 67 protected $_length; //查询的长度
  68. 68 /**
  69. 69 * 过滤后的条目数量.
  70. 70 *
  71. 71 * @var integer
  72. 72 */
  73. 73 protected $_recordsFiltered = 0; //过滤后的条目数量
  74. 74 /**
  75. 75 * 总的条目数量.
  76. 76 *
  77. 77 * @var integer
  78. 78 */
  79. 79 protected $_recordsTotal = 0; //总的条目数量
  80. 80 /**
  81. 81 * 返回的数据 没用到.
  82. 82 *
  83. 83 * @var [type]
  84. 84 */
  85. 85 protected $_return; //没用到
  86. 86 /**
  87. 87 * 存放构造函数的第二个参数.
  88. 88 *
  89. 89 * @var [type]
  90. 90 */
  91. 91 protected $_info; //存放构造函数的第二个参数
  92. 92
  93. 93 /**
  94. 94 * 构造函数 处理datatables发送的数据,用户自定义条件,.
  95. 95 *
  96. 96 * @param array $dataTableGet dataTable前台传递过来的数组
  97. 97 * @param array $info 构造好的数组结构如下
  98. 98 * example array( //表示 select ID AS sum,ID,USERNMAE 其中 sum用来统计数据的总条数
  99. 99 * "select"=array(
  100. 100 * "ID"=>"sum",
  101. 101 * "0"=>'ID',
  102. 102 * "1"=>"USERNAME",
  103. 103 * ),
  104. 104 * "order"=>array( //前台会发送过来根据哪一列排序 接收过来的值就是 键值,对应到数据表中的字段就是值,前台有几个列能够排序这里就需要有几个对应的键值队
  105. 105 * "0"=>"ID",
  106. 106 * "2"=>"USERNAME",
  107. 107 * ),
  108. 108 * "where"=>array( //and和or可以同时调用 但是or是用来做查询的 and则是初始数据的查询条件
  109. 109 * "and"=>array( //表示会查询state=1 and level=2 and (a=1 or a=2) 的数据
  110. 110 * "state"=>'1',
  111. 111 * "level"=>"2",
  112. 112 * "a"=>[1,2]
  113. 113 * ),
  114. 114 *
  115. 115 * 注:"or" 用户搜索的时候存在一个问题,参与搜索查询的列必须为同一类型比如id和name字段就不可以一起搜索会出现输入
  116. 116 * "qwer" sql为 (id like 0 or name like %qwer%)的情况
  117. 117 *
  118. 118 * "or"=>array("ID","USERNAME"), //用户查询的时候回根据这里的参数作为查询的列 例如 当search=root时 就会查询 ID like %root% or USERNAME like %root%
  119. 119 * "or2"=>[ //这里面的会用or连接 几乎很少用 例如下面的数组会变成: a=1 or a=2 or b=2
  120. 120 * a=>[1,2],
  121. 121 * b=>[2]
  122. 122 * ]
  123. 123 * ),
  124. 124 * "join"=>array(
  125. 125 * 'class'=>array('student.class_id','class.id'),
  126. 126 * 'sex'=>array('student.class_id','sex.id')
  127. 127 * )
  128. 128 * )
  129. 129 * @param string $db 数据库对象
  130. 130 *
  131. 131 * @return object this
  132. 132 */
  133. 133 public function __construct($dataTableGet, $info = array(), $table = '')
  134. 134 {
  135. 135 $this->_init($dataTableGet);
  136. 136 $this->_table = $table;
  137. 137 $this->_db = Db::table($this->_table);
  138. 138 $this->_info = $info;
  139. 139 }
  140. 140
  141. 141 /**
  142. 142 * 初始化参数,检查数据格式.
  143. 143 *
  144. 144 * @param array $data datatables发送过来的数据
  145. 145 */
  146. 146 protected function _init($data)
  147. 147 {
  148. 148 if (isset($data)) {
  149. 149 $this->_draw = isset($data['draw']) ? $data['draw'] : null;
  150. 150 $this->_length = isset($data['length']) ? intval($data['length']) : null;
  151. 151 $this->_start = isset($data['start']) ? intval($data['start']) : null;
  152. 152 $this->_order_column = isset($data['order']['0']['column']) ? intval($data['order']['0']['column']) : null;
  153. 153 $this->_order_dir = isset($data['order']['0']['dir']) ? $data['order']['0']['dir'] : null;
  154. 154 $this->_search = isset($data['search']['value']) ? $data['search']['value'] : null;
  155. 155 }
  156. 156 }
  157. 157
  158. 158 /**
  159. 159 * 输出datatables需要的数据格式,还需要打成json的格式才行.
  160. 160 *
  161. 161 * @param bool $debug true 会输出一些调试信息 默认false
  162. 162 *
  163. 163 * @return array atatables需要的数据格式
  164. 164 */
  165. 165 public function output($debug = false)
  166. 166 {
  167. 167 $data = $this->_info;
  168. 168 if (isset($data['select']) && !empty($data['select'])) {
  169. 169 $selectSql = $this->_getSelectSql($data['select']);
  170. 170 } else {
  171. 171 $selectSql = '*';
  172. 172 }
  173. 173 $this->_db = $this->_db->field($selectSql);
  174. 174 if (isset($data['join']) && !empty($data['join'])) {
  175. 175 foreach ($data['join'] as $key => $value) {
  176. 176 $this->_db = $this->_db->join($key,$value[0].' = '.$value[1]);
  177. 177 }
  178. 178 }
  179. 179 if (isset($data['order']) && !empty($data['order'])) {
  180. 180 $orderSql = $this->_getOrderSql($data['order']);
  181. 181 $this->_db = $this->_db->order($orderSql);
  182. 182 }
  183. 183 if (isset($data['where']) && !empty($data['where'])) {
  184. 184 $and = isset($data['where']['and']) && !empty($data['where']['and']) ? $data['where']['and'] : null;
  185. 185 $or = isset($data['where']['or']) && !empty($data['where']['or']) ? $data['where']['or'] : null;
  186. 186 $or2 = isset($data['where']['or2']) && !empty($data['where']['or2']) ? $data['where']['or2'] : null;
  187. 187 if(!is_null($and)){
  188. 188 foreach ($and as $key => $value) {
  189. 189 if(is_array($value)){
  190. 190 foreach ($value as $k => $v) {
  191. 191 $this->_db = $this->_db->whereOr($key,$v);
  192. 192 }
  193. 193 unset($and[$key]);
  194. 194 }
  195. 195 }
  196. 196 $this->_db = $this->_db->where($and);
  197. 197 }
  198. 198 if(!is_null($or)){
  199. 199 $or_val = '';
  200. 200 for ($i=0; $i < count($or); $i++) {
  201. 201 $or_val .= $i == count($or)-1 ? $or[$i] : $or[$i].'|';
  202. 202 }
  203. 203 if(!is_null($this->_search)&&$this->_search!=''){
  204. 204 $this->_db = $this->_db->where($or_val,'like','%'.$this->_search.'%');
  205. 205 }
  206. 206 }
  207. 207 if(!is_null($or2)){
  208. 208 foreach ($or2 as $key => $value) {
  209. 209 if(!is_array($value)) return false;
  210. 210 foreach ($value as $k => $v) {
  211. 211 $this->_db = $this->_db->whereOr($key,$v);
  212. 212 }
  213. 213 }
  214. 214 }
  215. 215 }
  216. 216 if (isset($this->_start) && isset($this->_length)) {
  217. 217 $this->_db = $this->_db->limit($this->_start,$this->_length);
  218. 218 }
  219. 219 if ($debug) {
  220. 220 var_dump($this->_db->fetchSql(true)->select());die;
  221. 221 }
  222. 222 $db1 = clone $this->_db;
  223. 223 $info = $this->_db->select();
  224. 224 $this->_recordsTotal = $db1->count();
  225. 225 $this->_recordsFiltered = $this->_recordsTotal;
  226. 226 return array(
  227. 227 'draw' => intval($this->_draw),
  228. 228 'recordsTotal' => intval($this->_recordsTotal),
  229. 229 'recordsFiltered' => intval($this->_recordsFiltered),
  230. 230 'data' => $info,
  231. 231 );
  232. 232 }
  233. 233
  234. 234 /**
  235. 235 * 当前台需要排序的时候会根据需要排序的列对应的表中的值排序
  236. 236 * 构建排序的sql.
  237. 237 *
  238. 238 * @param array $data 构造函数第二个参数order部分
  239. 239 *
  240. 240 * @return string 排序部分的sql语句
  241. 241 */
  242. 242 protected function _getOrderSql($data)
  243. 243 {
  244. 244 $sql = '';
  245. 245 if (is_array($data)) {
  246. 246 foreach ($data as $key => $value) {
  247. 247 if ($key == $this->_order_column) {
  248. 248 $sql = "{$value} ".$this->_order_dir;
  249. 249 break;
  250. 250 }
  251. 251 }
  252. 252 }
  253. 253 return $sql;
  254. 254 }
  255. 255
  256. 256 /**
  257. 257 * 构建select部分的sql语句.
  258. 258 *
  259. 259 * @param array $data 构造函数第二个参数select部分
  260. 260 *
  261. 261 * @return string select部分的语句
  262. 262 */
  263. 263 protected function _getSelectSql($data)
  264. 264 {
  265. 265 $list = array();
  266. 266 foreach ($data as $key => $value) {
  267. 267 if (is_numeric($key)) {
  268. 268 array_push($list, $value);
  269. 269 } else {
  270. 270 array_push($list, $key.' AS '.$value);
  271. 271 }
  272. 272 }
  273. 273 if (!empty($list)) {
  274. 274 $selectSql = implode(',', $list);
  275. 275 } else {
  276. 276 $selectSql = '*';
  277. 277 }
  278. 278 return $selectSql;
  279. 279 }
  280. 280 }

 

控制器类调用

  1. 1 <?php
  2. 2
  3. 3 namespace app\index\controller;
  4. 4
  5. 5 use think\Controller;
  6. 6 use think\Db;
  7. 7 use DataTable;
  8. 8
  9. 9 class Index extends Controller
  10. 10 {
  11. 11 public function list()
  12. 12 {
  13. 13 return view('index/list');
  14. 14 }
  15. 15
  16. 16 public function list_ajax()
  17. 17 {
  18. 18 $get = input('get.');
  19. 19 $where = [];
  20. 20 $data['select'] = ['think_user.id'=>'t_id','think_user.uname','think_user.upwd','think_banji.banji_name','think_user.status'];
  21. 21 $data['order'] = ['0'=>'think_user.id','1'=>'think_user.uname','2'=>'think_user.upwd','3'=>'think_banji.banji_name'];
  22. 22 // $data['where']['and'] = ['think_user.status'=>1,'think_user.id'=>[1,2]];
  23. 23 $data['where']['or'] = ['think_user.uname','think_user.upwd'];
  24. 24 $data['join'] = [
  25. 25 'think_banji'=>['think_user.banji_id','think_banji.id'],
  26. 26 ];
  27. 27 $a = new DataTable($get, $data, 'think_user');
  28. 28 return $a->output();
  29. 29 }
  30. 30 }

 

 

 

原文链接:http://www.cnblogs.com/a609251438/p/11811971.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号