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 相关文章推荐
php4的session功能评述(二)
Oct 09 PHP
COM in PHP (winows only)
Oct 09 PHP
php中AES加密解密的例子小结
Feb 18 PHP
在PHP中运行Linux命令并启动SSH服务的例子
Jun 12 PHP
修改ThinkPHP缓存为Memcache的方法
Jun 25 PHP
php基本函数汇总
Jul 09 PHP
学习php设计模式 php实现命令模式(command)
Dec 08 PHP
curl 出现错误的调试方法(必看)
Feb 13 PHP
PHP 进度条函数的简单实例
Sep 19 PHP
php链式操作的实现方式分析
Aug 12 PHP
laravel ORM关联关系中的 with和whereHas用法
Oct 16 PHP
深入分析PHP设计模式
Jun 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中常用的预定义变量小结
2012/05/09 PHP
php对数组排序的简单实例
2013/12/25 PHP
php中socket的用法详解
2014/10/24 PHP
PHP中SimpleXML函数用法分析
2014/11/26 PHP
php数组转成json格式的方法
2015/03/09 PHP
php利用反射实现插件机制的方法
2015/03/14 PHP
php判断对象是派生自哪个类的方法
2015/06/20 PHP
一个简单的网站访问JS计数器 刷新1次加1次访问
2012/09/20 Javascript
Javascript 加载和执行-性能提高篇
2012/12/28 Javascript
jquery实现每个数字上都带进度条的幻灯片
2013/02/20 Javascript
JavaScript的继承的封装介绍
2013/10/15 Javascript
node.js读取文件到字符串的方法
2015/06/29 Javascript
JavaScript实现打字效果的方法
2015/07/10 Javascript
包含中国城市的javascript对象实例
2015/08/03 Javascript
jQuery中cookie插件用法实例分析
2015/12/04 Javascript
bootstrap监听滚动实现头部跟随滚动
2016/11/08 Javascript
ionic cordova一次上传多张图片(类似input file提交表单)的实现方法
2016/12/16 Javascript
jQuery表单插件ajaxForm实例详解
2017/01/17 Javascript
javascript 动态生成css代码的两种方法
2017/03/17 Javascript
ES6知识点整理之函数数组参数的默认值及其解构应用示例
2019/04/17 Javascript
vue开发chrome插件,实现获取界面数据和保存到数据库功能
2020/12/01 Vue.js
简单介绍Python中的JSON使用
2015/04/28 Python
python如何定义带参数的装饰器
2018/03/20 Python
Python给图像添加噪声具体操作
2019/03/03 Python
基于Python的PIL库学习详解
2019/05/10 Python
python设置随机种子实例讲解
2019/09/12 Python
python matplotlib拟合直线的实现
2019/11/19 Python
Matlab中plot基本用法的具体使用
2020/07/17 Python
零基础学python应该从哪里入手
2020/08/11 Python
Python代码注释规范代码实例解析
2020/08/14 Python
UGG英国官方网站:UGG UK
2018/02/08 全球购物
英国123鲜花网站:123 Flowers
2019/07/07 全球购物
政府法律服务方案
2014/06/14 职场文书
华清池导游词
2015/02/02 职场文书
公文写作:新员工转正申请书范本3篇!
2019/08/07 职场文书
MySQL选择合适的备份策略和备份工具
2022/06/01 MySQL