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 相关文章推荐
不用数据库的多用户文件自由上传投票系统(1)
Oct 09 PHP
PHP Cookie的使用教程详解
Jun 03 PHP
PHP stripos()函数及注意事项的分析
Jun 08 PHP
php中单个数据库字段多列显示(单字段分页、横向输出)
Jul 28 PHP
重新认识php array_merge函数
Aug 31 PHP
11个PHPer必须要了解的编程规范
Sep 22 PHP
php模拟post提交数据的方法
Feb 12 PHP
PHP aes (ecb)解密后乱码问题
Jun 22 PHP
PHP实现的迷你漂流瓶
Jul 29 PHP
PHP常用的三种设计模式汇总
Aug 28 PHP
php检测mysql表是否存在的方法小结
Jul 20 PHP
PHP 判断字符串是中文还是英文, 或者是中英混合
Mar 09 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
基于文本的留言簿
2006/10/09 PHP
php header Content-Type类型小结
2011/07/03 PHP
PHP+JS实现大规模数据提交的方法
2015/07/02 PHP
Javascript 获取字符串字节数的多种方法
2009/06/02 Javascript
JavaScript 学习历程和心得分享
2010/12/12 Javascript
Javascript动态引用CSS文件的2种方法介绍
2014/06/06 Javascript
js实现的简单radio背景颜色选择器代码
2015/08/18 Javascript
JavaScript代码轻松实现网页内容禁止复制(代码简单)
2015/10/23 Javascript
JS打开摄像头并截图上传示例
2017/02/18 Javascript
JavaScript比较两个数组的内容是否相同(推荐)
2017/05/02 Javascript
vue form 表单提交后刷新页面的方法
2018/09/04 Javascript
layui 数据表格+分页+搜索+checkbox+缓存选中项数据的方法
2019/09/21 Javascript
Vue中使用Lodop插件实现打印功能的简单方法
2019/12/19 Javascript
Javascript实现秒表计时游戏
2020/05/27 Javascript
nodejs中内置模块fs,path常见的用法说明
2020/11/07 NodeJs
[06:07]刀塔密之二:攻之吾命受之吾幸
2014/07/03 DOTA
python使用pil生成缩略图的方法
2015/03/26 Python
在Django中创建URLconf相关的通用视图的方法
2015/07/20 Python
浅谈Python处理PDF的方法
2017/11/10 Python
django模板语法学习之include示例详解
2017/12/17 Python
python 将字符串转换成字典dict的各种方式总结
2018/03/23 Python
pandas 对series和dataframe进行排序的实例
2018/06/09 Python
python 快速把超大txt文件转存为csv的实例
2018/10/26 Python
python数据处理 根据颜色对图片进行分类的方法
2018/12/08 Python
对python以16进制打印字节数组的方法详解
2019/01/24 Python
使用Python自动化破解自定义字体混淆信息的方法实例
2019/02/13 Python
Django 内置权限扩展案例详解
2019/03/04 Python
用Python调用win命令行提高工作效率的实例
2019/08/14 Python
如何使用localstorage代替cookie实现跨域共享数据问题
2018/04/18 HTML / CSS
自荐信格式
2013/12/01 职场文书
班主任师德师风自我剖析材料
2014/10/02 职场文书
2016党员发展对象培训心得体会
2016/01/08 职场文书
生鲜超市—未来中国最具有潜力零售业态
2019/08/02 职场文书
2020年个人安全保证书参考模板
2020/01/08 职场文书
一定要知道的 25 个 Vue 技巧
2021/11/02 Vue.js
Spring Cloud Netflix 套件中的负载均衡组件 Ribbon
2022/04/13 Java/Android