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 相关文章推荐
在PHP3中实现SESSION的功能(二)
Oct 09 PHP
第十一节--重载
Nov 16 PHP
简单实现限定phpmyadmin访问ip的方法
Mar 05 PHP
CodeIgniter框架中_remap()使用方法2例
Mar 10 PHP
php中异常处理方法小结
Jan 09 PHP
PHP中余数、取余的妙用
Jun 29 PHP
php基于openssl的rsa加密解密示例
Jul 11 PHP
php将从数据库中获得的数据转换成json格式并输出的方法
Aug 21 PHP
PHP数组遍历的几种常见方式总结
Feb 15 PHP
Laravel Validator 实现两个或多个字段联合索引唯一
May 08 PHP
PHP使用PhpSpreadsheet操作Excel实例详解
Mar 26 PHP
Yii框架应用组件用法实例分析
May 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数据库连接
2006/10/09 PHP
关于时间计算的结总
2006/12/06 PHP
PHP 数据结构 算法 三元组 Triplet
2011/07/02 PHP
php中的四舍五入函数代码(floor函数、ceil函数、round与intval)
2014/07/14 PHP
thinkphp学习笔记之多表查询
2014/07/28 PHP
PHP mysqli事务操作常用方法分析
2017/07/22 PHP
php生成静态页面并实现预览功能
2019/06/27 PHP
奉献给JavaScript初学者的编写开发的七个细节
2011/01/11 Javascript
JQuery1.6 使用方法三
2011/11/23 Javascript
jQuery插件分享之分页插件jqPagination
2014/06/06 Javascript
基于jquery和svg实现超炫酷的动画特效
2014/12/09 Javascript
封装好的js判断操作系统与浏览器代码分享
2015/01/09 Javascript
简化版手机端照片预览组件
2015/04/13 Javascript
jquery 实现输入邮箱时自动补全下拉提示功能
2015/10/04 Javascript
JS监听微信、支付宝等移动app及浏览器的返回、后退、上一页按钮的事件方法
2016/08/05 Javascript
jQuery如何防止Ajax重复提交
2016/10/14 Javascript
jquery实现图片列表鼠标移入微动
2016/12/01 Javascript
js replace()去除代码中空格的实例
2017/02/14 Javascript
xmlplus组件设计系列之网格(DataGrid)(10)
2017/05/05 Javascript
element-ui和vue表单(对话框)验证提示语(残留)清除操作
2020/09/11 Javascript
Python __setattr__、 __getattr__、 __delattr__、__call__用法示例
2015/03/06 Python
python通过floor函数舍弃小数位的方法
2015/03/17 Python
介绍Python的@property装饰器的用法
2015/04/28 Python
Python抓取框架 Scrapy的架构
2016/08/12 Python
Python中的浮点数原理与运算分析
2017/10/12 Python
python实现分页效果
2017/10/25 Python
6种非常炫酷的CSS3按钮边框动画特效
2016/03/16 HTML / CSS
详解background属性的8个属性值(面试题)
2020/11/02 HTML / CSS
Godiva巧克力英国官网:比利时歌帝梵巧克力
2018/08/28 全球购物
德国富尔达运动鞋店:43einhalb
2020/12/25 全球购物
桥梁与隧道工程专业本科生求职信
2013/10/08 职场文书
小学生手册家长评语
2014/04/16 职场文书
2016年教师学习教师法心得体会
2016/01/20 职场文书
小学音乐课教学反思
2016/02/18 职场文书
Vue CLI中模式与环境变量的深入详解
2021/05/30 Vue.js
vue/cli 配置动态代理无需重启服务的方法
2022/05/20 Vue.js