>  기사  >  백엔드 개발  >  ThinkPHP의 다중 테이블 쿼리 및 페이징 기능 구현 방법

ThinkPHP의 다중 테이블 쿼리 및 페이징 기능 구현 방법

墨辰丷
墨辰丷원래의
2018-05-21 09:35:281971검색

이 글은 주로 thinkPHP 다중 테이블 쿼리 구현 방법과 페이징 기능을 소개하고, thinkPHP 다중 테이블 쿼리의 관련 구현 기법과 쿼리 결과의 페이징 표시를 구체적인 예시 형태로 분석해 도움이 필요한 친구들이 참고할 수 있다.

자세한 내용은 다음과 같습니다.

프로젝트의 비즈니스 로직은 교사가 시험지를 업로드하고, 답안지를 설정하고, 시험지와 관련된 답안지가 게시된 후에만 해당 학급이나 그룹에 답안지를 게시하는 것입니다. 시험지는 시스템 시험지에서 검색할 수 있으며, 다른 교사도 수집할 수 있습니다. 프론트엔드 수집 모듈에는 사용자에게 검색 기능을 제공하기 위해 입력란을 제공하는 업체가 있는데, 미리 디자인된 검색 테이블에서는 시험지 테이블과 연결된 시험지 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[&#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);
}
: 관련 추천:


다중 테이블 쿼리 및 하위 쿼리 인스턴스

파이썬 플라스크 멀티 페어 멀티 테이블 쿼리 자세한 설명

MySQL 공통 기본 연산 구문(8)~~

다중 테이블 쿼리결과 병합 및 내부 조인 쿼리 [명령줄 모드]

🎜🎜🎜🎜🎜🎜🎜

위 내용은 ThinkPHP의 다중 테이블 쿼리 및 페이징 기능 구현 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.