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 创建文件(文件夹)以及目录操作代码
Mar 04 PHP
PHP中文件缓存转内存缓存的方法
Dec 06 PHP
浅析PHP递归函数返回值使用方法
Feb 18 PHP
php多个字符串替换成同一个的解决方法
Jun 18 PHP
PHP 清空varnish 缓存的详解(包括指定站点下的)
Jun 20 PHP
PHP编译安装时常见错误解决办法
May 28 PHP
php类的自动加载操作实例详解
Sep 28 PHP
phalcon model在插入或更新时会自动验证非空字段的解决办法
Dec 29 PHP
PHP实现的迪科斯彻(Dijkstra)最短路径算法实例
Sep 16 PHP
PHP实现基于3DES算法加密解密字符串示例
Aug 24 PHP
php 后端实现JWT认证方法示例
Sep 04 PHP
php测试kafka项目示例
Feb 06 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 导出Excel示例分享
2014/08/18 PHP
YII Framework框架教程之日志用法详解
2016/03/14 PHP
ZendFramework框架实现连接两个或多个数据库的方法
2016/12/08 PHP
php查找字符串中第一个非0的位置截取
2017/02/27 PHP
一个简单的JavaScript数据缓存系统实现代码
2010/10/24 Javascript
jQuery的学习步骤
2011/02/23 Javascript
为原生js Array增加each方法
2012/04/07 Javascript
关于图片的预加载过程中隐藏未知的
2012/12/19 Javascript
select、radio表单回显功能实现避免使用jquery载入赋值
2013/06/08 Javascript
js导出table到excel同时兼容FF和IE示例
2013/09/03 Javascript
PHP实现的各种中文编码转换类分享
2015/01/23 Javascript
jQuery 监控键盘一段时间没输入
2016/04/22 Javascript
快速实现jQuery多级菜单效果
2017/02/01 Javascript
使用vue-router beforEach实现判断用户登录跳转路由筛选功能
2018/06/25 Javascript
antd多选下拉框一行展示的实现方式
2020/10/31 Javascript
pydev使用wxpython找不到路径的解决方法
2013/02/10 Python
python中的内置函数getattr()介绍及示例
2014/07/20 Python
Python使用MONGODB入门实例
2015/05/11 Python
python通过getopt模块如何获取执行的命令参数详解
2017/12/29 Python
Python键盘输入转换为列表的实例
2018/06/23 Python
Python提取PDF内容的方法(文本、图像、线条等)
2019/09/25 Python
Python基本语法之运算符功能与用法详解
2019/10/22 Python
python中tab键是什么意思
2020/06/18 Python
罗德与泰勒百货官网:Lord & Taylor
2016/08/12 全球购物
美国精品家居用品网站:US-Mattress
2016/08/24 全球购物
台湾线上百货零售购物平台:friDay购物
2017/08/18 全球购物
override和overload的区别
2016/03/09 面试题
优秀员工表扬信
2014/01/17 职场文书
大学国际贸易专业自荐信
2014/06/05 职场文书
政府四风问题整改措施
2014/10/04 职场文书
计算机实训报告范文
2014/11/05 职场文书
2014年高三班主任工作总结
2014/12/05 职场文书
2014年法务工作总结
2014/12/11 职场文书
新闻报道稿范文
2015/07/23 职场文书
html+css实现分层金字塔的实例
2021/06/02 HTML / CSS
浅谈MySQL next-key lock 加锁范围
2021/06/07 MySQL