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的分页显示
Oct 09 PHP
一个PHP操作Access类(PHP+ODBC+Access)
Jan 02 PHP
自动生成文章摘要的代码[PHP 版本]
Mar 20 PHP
php设计模式 Strategy(策略模式)
Jun 26 PHP
php中get_headers函数的作用及用法的详细介绍
Apr 27 PHP
深入解析php之apc
May 15 PHP
PHP实现获取域名的方法小结
Nov 05 PHP
php上传中文文件名乱码问题处理方案
Feb 03 PHP
thinkPHP中分页用法实例分析
Dec 26 PHP
解决Yii2邮件发送结果返回成功,但接收不到邮件的问题
May 23 PHP
基于swoole实现多人聊天室
Jun 14 PHP
PHP中ltrim()函数的用法与实例讲解
Mar 28 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 $_ENV为空的原因分析
2009/06/01 PHP
Yii2.0中的COOKIE和SESSION用法
2016/08/12 PHP
Laravel中validation验证 返回中文提示 全局设置的方法
2019/09/29 PHP
js对象数组按属性快速排序
2011/01/31 Javascript
js获取html文件的思路及示例
2013/09/17 Javascript
JS获取计算机mac地址以及IP的实现方法
2014/01/08 Javascript
js实现飞入星星特效代码
2014/10/17 Javascript
jQuery多级联动下拉插件chained用法示例
2016/08/20 Javascript
JS判断是否为JSON对象及是否存在某字段的方法(推荐)
2016/11/29 Javascript
利用webstrom调试Vue.js单页面程序的方法教程
2017/06/06 Javascript
详谈AngularJs 控制器、数据绑定、作用域
2017/07/09 Javascript
zTree树形菜单交互选项卡效果的实现方法
2017/12/25 Javascript
用最少的JS代码写出贪吃蛇游戏
2018/01/12 Javascript
MVVM框架下实现分页功能示例
2018/06/14 Javascript
Vue组件的使用及个人理解与介绍
2019/02/09 Javascript
微信小程序云开发实现云数据库读写权限
2019/05/17 Javascript
Vue.js路由实现选项卡简单实例
2019/07/24 Javascript
layui表格分页 记录勾选的实例
2019/09/02 Javascript
kafka调试中遇到Connection to node -1 could not be established. Broker may not be available.
2019/09/17 Javascript
Ant Design Pro 下实现文件下载的实现代码
2019/12/03 Javascript
微信小程序自定义联系人弹窗
2020/05/26 Javascript
[01:45:05]VGJ.T vs Newbee Supermajor 败者组 BO3 第二场 6.6
2018/06/07 DOTA
[05:59]2018DOTA2国际邀请赛寻真——只为胜利的Secret
2018/08/13 DOTA
Python解析树及树的遍历
2016/02/03 Python
使用python根据端口号关闭进程的方法
2018/11/06 Python
详解如何设置Python环境变量?
2019/05/13 Python
使用opencv将视频帧转成图片输出
2019/12/10 Python
Java中实现多态的机制是什么?
2014/12/07 面试题
创建无烟单位实施方案
2014/03/29 职场文书
公司运动会策划方案
2014/05/25 职场文书
师德师风剖析材料
2014/09/30 职场文书
2015年团支部工作总结
2015/04/03 职场文书
银行稽核岗位职责
2015/04/13 职场文书
管理失职检讨书
2015/05/05 职场文书
聊一聊python常用的编程模块
2021/05/14 Python
如何用python清洗文件中的数据
2021/06/18 Python