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 相关文章推荐
一个odbc连mssql分页的类
Oct 09 PHP
用PHP调用Oracle存储过程
Oct 09 PHP
用PHP函数解决SQL injection
Dec 09 PHP
E路文章系统PHP
Dec 11 PHP
PHP读取目录下所有文件的代码
Jan 07 PHP
用php获取远程图片并把它保存到本地的代码
Apr 07 PHP
php学习笔记 类的声明与对象实例化
Jun 13 PHP
php在服务器执行exec命令失败的解决方法
Mar 03 PHP
PHP中使用Imagick实现各种图片效果实例
Jan 21 PHP
让你的PHP7更快之Hugepage用法分析
May 31 PHP
Yii2实现多域名跨域同步登录退出
Feb 04 PHP
PHP中使用CURL发送get/post请求上传图片批处理功能
Oct 15 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 Laravel 上传图片、文件等类封装
2017/08/16 PHP
Laravel统计一段时间间隔的数据方法
2019/10/09 PHP
JQuery 选择器、过滤器介绍
2011/02/14 Javascript
jQuery实现带渐显效果的人物多级关系图代码
2015/10/16 Javascript
Bootstrap轮播加上css3动画,炫酷到底!
2015/12/22 Javascript
详解Angularjs filter过滤器
2016/02/06 Javascript
javascript创建cookie、读取cookie
2016/03/31 Javascript
bootstrap laydate日期组件使用详解
2017/01/04 Javascript
浅谈react.js 之 批量添加与删除功能
2017/04/17 Javascript
Nodejs读取文件时相对路径的正确写法(使用fs模块)
2017/04/27 NodeJs
使用bootstrap插件实现模态框效果
2017/05/10 Javascript
JS滚动到指定位置导航栏固定顶部
2017/07/03 Javascript
详细AngularJs4的图片剪裁组件的实例
2017/07/12 Javascript
JS轮播图实现简单代码
2021/02/19 Javascript
vue 自定义指令自动获取文本框焦点的方法
2018/08/25 Javascript
在vue 中使用 less的教程详解
2018/09/26 Javascript
详解小程序中h5页面onShow实现及跨页面通信方案
2019/05/30 Javascript
Vue最新防抖方案(必看篇)
2019/10/30 Javascript
微信小程序indexOf的替换方法(推荐)
2020/01/14 Javascript
在Python中使用M2Crypto模块实现AES加密的教程
2015/04/08 Python
Python的SQLAlchemy框架使用入门
2015/04/29 Python
PyQt5每天必学之布局管理
2018/04/19 Python
Python实现的简单读写csv文件操作示例
2018/07/12 Python
python+opencv 读取文件夹下的所有图像并批量保存ROI的方法
2019/01/10 Python
新年福利来一波之Python轻松集齐五福(demo)
2020/01/20 Python
keras做CNN的训练误差loss的下降操作
2020/06/22 Python
纯CSS3实现圆圈动态发光特效动画的示例代码
2021/03/08 HTML / CSS
英国Office鞋店德国网站:在线购买鞋子、靴子和运动鞋
2018/12/19 全球购物
LN-CC中国:高端男装和女装的奢侈时尚目的地
2019/09/14 全球购物
The North Face官方旗舰店:美国著名户外品牌
2020/09/28 全球购物
中秋节活动总结
2014/08/29 职场文书
企业总经理助理岗位职责
2014/09/12 职场文书
个人剖析材料范文
2014/09/30 职场文书
先进个人材料怎么写
2014/12/30 职场文书
铁人观后感
2015/06/16 职场文书
JS代码编译器Monaco使用方法
2021/06/11 Javascript