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 相关文章推荐
PHPlet在Windows下的安装
Oct 09 PHP
PHP与MySQL交互使用详解
Oct 09 PHP
WHOIS类的修改版
Oct 09 PHP
PHP一些有意思的小区别
Dec 06 PHP
php的ajax简单实例
Feb 27 PHP
PHP实现163邮箱自动发送邮件
Mar 29 PHP
PHP文件上传操作实例详解
Sep 27 PHP
PHP实现上传多文件示例代码
Feb 20 PHP
php设计模式之职责链模式定义与用法经典示例
Sep 19 PHP
Laravel框架基础语法与知识点整理【模板变量、输出、include引入子视图等】
Dec 03 PHP
解决PHP Opcache 缓存刷新、代码重载出现无法更新代码的问题
Aug 24 PHP
详解Laravel服务容器的优势
May 29 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-FPM和Nginx的通信机制详解
2019/02/01 PHP
js RuntimeObject() 获取ie里面自定义函数或者属性的集合
2010/11/23 Javascript
jquery(live)中File input的change方法只起一次作用的解决办法
2011/10/21 Javascript
jquery 操作DOM的基本用法分享
2012/04/05 Javascript
jquery和javascript的区别(常用方法比较)
2013/07/04 Javascript
javascript中checkbox使用方法实例演示
2015/11/19 Javascript
jQuery事件绑定用法详解(附bind和live的区别)
2016/01/19 Javascript
Web前端开发之水印、图片验证码
2016/11/27 Javascript
JS实现百度网盘任意文件强制下载功能
2018/08/31 Javascript
vue实现简单学生信息管理
2020/05/30 Javascript
[06:24]DOTA2 2015国际邀请赛中国区预选赛第二日TOP10
2015/05/27 DOTA
Python自动连接ssh的方法
2015/03/07 Python
使用IronPython把Python脚本集成到.NET程序中的教程
2015/03/31 Python
python自动裁剪图像代码分享
2017/11/25 Python
pandas数据分组和聚合操作方法
2018/04/11 Python
spark: RDD与DataFrame之间的相互转换方法
2018/06/07 Python
Python迭代器与生成器用法实例分析
2018/07/09 Python
Python中修改字符串的四种方法
2018/11/02 Python
利用Python正则表达式过滤敏感词的方法
2019/01/21 Python
Python3远程监控程序的实现方法
2019/07/15 Python
Python django框架 web端视频加密的实例详解
2020/11/20 Python
python爬虫泛滥的解决方法详解
2020/11/25 Python
python 检测nginx服务邮件报警的脚本
2020/12/31 Python
详解tf.device()指定tensorflow运行的GPU或CPU设备实现
2021/02/20 Python
将HTML5 Canvas的内容保存为图片借助toDataURL实现
2013/05/20 HTML / CSS
国际金融专业大学生职业生涯规划书
2013/12/28 职场文书
央视元宵晚会主持串词
2014/03/25 职场文书
大学生见习报告范文
2014/11/03 职场文书
整改报告怎么写
2014/11/06 职场文书
创业计划书之寿司
2019/07/19 职场文书
用golang如何替换某个文件中的字符串
2021/04/25 Golang
详解Java实践之建造者模式
2021/06/18 Java/Android
Django REST framework 限流功能的使用
2021/06/24 Python
图文详解Nginx版本平滑升级方案
2021/09/15 Servers
pd.drop_duplicates删除重复行的方法实现
2022/06/16 Python
Navicat Premium自定义 sql 标签的创建方式
2022/09/23 数据库