Home  >  Article  >  Backend Development  >  ThinkPHP's method of implementing multi-table query and paging functions

ThinkPHP's method of implementing multi-table query and paging functions

墨辰丷
墨辰丷Original
2018-05-21 09:35:281944browse

This article mainly introduces the implementation method of thinkPHP multi-table query and paging function, and analyzes the related implementation techniques of thinkPHP multi-table query and paging display of query results based on specific examples. Friends in need can refer to the following

The details are as follows:

The business logic of the project is: the teacher uploads the test paper, sets the answer sheet, and publishes the answer sheet to the relevant class or group. Only after the answer sheet associated with the test paper is released, can the test paper be included in the system test paper After searching, other teachers can also collect it. In the front-end collection module, there is a business that provides an input box to provide search functions to users. However, in the pre-designed search table, only one test paper ID is associated with the test paper table. What if the user searches for the test paper title? Instead of querying two tables, the method I thought of at first was to add an extra field to the collection table, that is, add the fields of the test paper questions to the collection table, and the business is completed. Today when I was dealing with the logic of question bank sharing, I discovered this problem again. I saw that the sharing table designed by my colleague only had one question bank ID, so I called my colleague over to "correct it", but I still wanted to hear my colleague's design ideas beforehand. , my colleague said that it is a table query, let me check it out, it seems that I am used to using a table query, I did not expect this situation, and was despised, so I faced my mistake squarely, of course, the premise is to talk about my own The idea is not quite right now that I think about it, so I will give the relevant TP code below.

// 异步请求试卷夹下某一个试卷夹的列表
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[&#39;re_title&#39;] = str_replace($vv, &#39;<font color=\&#39;red\&#39;>&#39; . $vv . &#39;</font>&#39;, $value[&#39;re_title&#39;]);
        }
        if (strpos($value[&#39;rta_title&#39;], $vv) !== FALSE) {
          $value[&#39;rta_title&#39;] = str_replace($vv, &#39;<font color=\&#39;red\&#39;>&#39; . $vv . &#39;</font>&#39;, $value[&#39;rta_title&#39;]);
        }
      }
    }
    $value[&#39;re_created&#39;] = date(&#39;Y-m-d&#39;, $value[&#39;re_created&#39;]);
  }
  echo json_encode($list);
}

Related recommendations:

Constraints and Multi-table queries in MySQLAnd detailed examples of subqueries

python flask multi-pairMultiple table queriesDetailed examples of examples

Mysql common basic operation syntax (8)~~Multiple table queryMerge results and inner join query [command line mode]

The above is the detailed content of ThinkPHP's method of implementing multi-table query and paging functions. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn