thinkPHP多表查询及分页功能实现方法示例


Posted in PHP onJuly 03, 2017

本文实例讲述了thinkPHP多表查询及分页功能实现方法。分享给大家供大家参考,具体如下:

项目业务逻辑为:教师上传试卷,设置答题卡,发布答题卡给相关的班级或群组,只有试卷关联的答题卡发布后,该试卷才能在系统试卷中搜索到,同时其他的老师也可以收藏。在前端的收藏模块中,有个业务是给个input框以提供搜索功能给用户,但是在事先设计的搜索表中,只有一处试卷ID是和试卷表关联的,如果用户搜索试卷题目那岂不要两表查询了,一开始我想到的方法是在收藏表中多加个字段,也就是把试卷题目的字段添加到收藏表中,业务完成。今天在处理题库分享的逻辑时,又发现了这个问题,看了下同事设计的分享表只有一个题库ID,于是我便把同事叫过来“纠正”,但事先我还是想听听同事的设计思路,同事说量表查询啊,我勒个去,看来我一张表查询使用习惯了,没有想到此种情况,被鄙视了,于是正视了自己的错误,当然了前提是说了下自己的思路,现在想来不怎么对,下面便给给出相关的tp代码。

// 异步请求试卷夹下某一个试卷夹的列表
public function ajaxLists() {
  extract($_GET);
  $page = intval($_GET['p']);
  $prefix = C('DB_PREFIX');
  $collect = $prefix . 'collect';
  $resource = $prefix . 'resource';
  if ($keyword) {
    $arr = preg_split('/ /', $keyword);
    // 搜索标签
    foreach ($arr as $value) {
      $id = A('Home/Papers')->trunWordToId(array($value));
      if ($id) {
        $where['resource.rta_id'][] = array('LIKE', '%,' . $id . ',%');
      }
      $where['resource.re_title'][] = array('LIKE', '%' . $value . '%');
    }
    if ($where['resource.rta_id']) {
      $where['resource.rta_id'][] = 'AND';
    }
    if ($where['resource.re_title']) {
      $where['resource.re_title'][] = 'OR';
    }
    if ($where['resource.re_title'] && $where['resource.rta_id']) {
      $where['_logic'] = 'OR';
    }
  }
  if ($where) {
    $map['_complex'] = $where;
  }
  $map['collect.a_id'] = $this->authInfo['a_id'];
  $map['_string'] = 'collect.col_object_id = resource.re_id';
  // 总数
  $count = M()->table("$collect collect, $resource resource")->where($map)->count();
  // 总页数
  $regNum = ceil($count/6);
  // 验证当前请求页码是否大于总页数
  $page = $page > $regNum ? $regNum : $page;
  // 引入ajax分页库
  import("@.ORG.Util.AjaxPage");
  $Page = new AjaxPage($count, 6);
  $list['page'] = trim($Page->show());
  $list['list'] = M()->table("$collect collect, $resource resource")->where($map)->order('col_id DESC')->limit($Page->firstRow . ',' . $Page->listRows)->field('collect.col_id,collect.col_object_id,resource.re_id,resource.re_title,resource.re_created,resource.re_collect_count,resource.re_score_count,resource.re_score_num,resource.rta_id')->select();
  // 获取试卷的标签
  $wheree['rta_id'] = array('IN', trim(str_replace(',,', ',', implode('', getValueByField($list['list'], 'rta_id'))), ','));
  $tag = setArrayByField(M('ResourceTag')->where($wheree)->field('rta_id,rta_title')->select(), 'rta_id');
  // 把标签和试卷对应
  foreach ($list['list'] as $key => &$value) {
    $str = '';
    foreach ($tag as $k => $v) {
      if (strpos($value['rta_id'], ',' . $k . ',') !== FALSE) {
        $str .= ' | ' . $v['rta_title'];
      }
      $value['rta_title'] = trim($str, ' |');
    }
    if ($keyword) {
      foreach ($arr as $vv) {
        if (strpos($value['re_title'], $vv) !== FALSE) {
          $value['re_title'] = str_replace($vv, '<font color=\'red\'>' . $vv . '</font>', $value['re_title']);
        }
        if (strpos($value['rta_title'], $vv) !== FALSE) {
          $value['rta_title'] = str_replace($vv, '<font color=\'red\'>' . $vv . '</font>', $value['rta_title']);
        }
      }
    }
    $value['re_created'] = date('Y-m-d', $value['re_created']);
  }
  echo json_encode($list);
}

希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。

PHP 相关文章推荐
在php MYSQL中插入当前时间
Apr 06 PHP
Zend Guard一些常见问题解答
Sep 11 PHP
PHP编程过程中需要了解的this,self,parent的区别
Dec 30 PHP
PHP array操作10个小技巧分享
Jun 23 PHP
PHP删除非空目录的函数代码小结
Feb 28 PHP
基于php常用函数总结(数组,字符串,时间,文件操作)
Jun 27 PHP
ThinkPHP的MVC开发机制实例解析
Aug 23 PHP
PHP文件读写操作相关函数总结
Nov 18 PHP
smarty表格换行实例
Dec 15 PHP
PHP使用CURL模拟登录的方法
Jul 08 PHP
php实现等比例压缩图片
Jul 26 PHP
php操作redis数据库常见方法实例总结
Feb 20 PHP
PHP+Ajax实现的无刷新分页功能详解【附demo源码下载】
Jul 03 #PHP
PHP 返回数组后处理方法(开户成功后弹窗提示)
Jul 03 #PHP
php获取文章内容第一张图片的方法示例
Jul 03 #PHP
PHP中$GLOBALS['HTTP_RAW_POST_DATA']和$_POST的区别分析
Jul 03 #PHP
PHP不使用内置函数实现字符串转整型的方法示例
Jul 03 #PHP
利用PHP判断是否是连乘数字串的方法示例
Jul 03 #PHP
使用Zttp简化Guzzle 调用
Jul 02 #PHP
You might like
分享PHP源码批量抓取远程网页图片并保存到本地的实现方法
2015/12/01 PHP
在Mac OS下搭建LNMP开发环境的步骤详解
2017/03/10 PHP
PHP如何获取Cookie并实现模拟登录
2020/07/16 PHP
JQuery 引发两次$(document.ready)事件
2010/01/15 Javascript
jquery实现每个数字上都带进度条的幻灯片
2013/02/20 Javascript
js 自动播放的实例代码
2013/11/19 Javascript
jQuery实现的网页竖向菜单效果代码
2015/08/26 Javascript
js操作table元素实现表格行列新增、删除技巧总结
2015/11/18 Javascript
浅谈Vue.js 1.x 和 2.x 实例的生命周期
2017/07/25 Javascript
JavaScript调试之console.log调试的一个小技巧分享
2017/08/07 Javascript
Vue 动态设置路由参数的案例分析
2018/04/24 Javascript
JavaScript树的深度优先遍历和广度优先遍历算法示例
2018/07/30 Javascript
vue初始化动画加载的实例
2018/09/01 Javascript
layui加载数据显示loading加载完成loading消失的实例代码
2019/09/23 Javascript
vue限制输入框只能输入8位整数和2位小数的代码
2019/11/06 Javascript
解决pycharm工程启动卡住没反应的问题
2019/01/19 Python
Python循环实现n的全排列功能
2019/09/16 Python
python利用openpyxl拆分多个工作表的工作簿的方法
2019/09/27 Python
利用Python优雅的登录校园网
2020/10/21 Python
Python 里最强的地图绘制神器
2021/03/01 Python
python 中 .py文件 转 .pyd文件的操作
2021/03/04 Python
Html5移动端弹幕动画实现示例代码
2018/08/27 HTML / CSS
应届毕业生求职信范文
2013/12/18 职场文书
工作决心书范文
2014/03/11 职场文书
校长寄语大全
2014/04/09 职场文书
学校社会实践活动总结
2014/07/03 职场文书
领导干部遵守党的政治纪律情况思想汇报
2014/09/14 职场文书
生产现场禁烟通知
2015/04/23 职场文书
2015年项目工作总结
2015/04/29 职场文书
乡镇科协工作总结2015
2015/05/19 职场文书
勇敢的心观后感
2015/06/09 职场文书
2019最新公司租房合同(例文)
2019/07/18 职场文书
k8s部署redis cluster集群的实现
2021/06/24 Redis
能让Python提速超40倍的神器Cython详解
2021/06/24 Python
Python实现生活常识解答机器人
2021/06/28 Python
MySQL串行化隔离级别(间隙锁实现)
2022/06/16 MySQL