Maison  >  Article  >  développement back-end  >  Méthode ThinkPHP d'implémentation de fonctions de requête et de pagination multi-tables

Méthode ThinkPHP d'implémentation de fonctions de requête et de pagination multi-tables

墨辰丷
墨辰丷original
2018-05-21 09:35:281982parcourir

Cet article présente principalement la méthode d'implémentation de la requête multi-table thinkPHP et la fonction de pagination. Il analyse les techniques d'implémentation associées de la requête multi-table thinkPHP et l'affichage paginé des résultats de la requête sur la base d'exemples spécifiques.

Les détails sont les suivants :

La logique métier du projet est la suivante : l'enseignant télécharge l'épreuve, définit la feuille de réponses et publie la feuille de réponses à la classe ou au groupe concerné seulement après. la feuille de réponses associée à l'épreuve est publiée, l'épreuve peut-elle être incluse dans l'épreuve du système Après la recherche, d'autres enseignants peuvent également la récupérer. Dans le module de collecte frontal, il existe une entreprise qui fournit une zone de saisie pour fournir des fonctions de recherche aux utilisateurs. Cependant, dans le tableau de recherche prédéfini, un seul ID de papier de test est associé à la table de papier de test. L'utilisateur recherche le titre de l'épreuve ? Au lieu d'interroger deux tables, la méthode à laquelle j'ai pensé au début était d'ajouter un champ supplémentaire à la table de collecte, c'est-à-dire d'ajouter les champs des questions de l'épreuve à la table de collecte, et le les affaires sont terminées. Aujourd'hui, alors que je traitais de la logique du partage de banque de questions, j'ai découvert à nouveau ce problème. J'ai vu que la table de partage conçue par mon collègue n'avait qu'un seul identifiant de banque de questions, j'ai donc appelé mon collègue pour le "corriger", mais avant. Je voulais toujours entendre les idées de conception de mon collègue, mon collègue a dit qu'il s'agissait d'une requête de table, laissez-moi vérifier, il semble que j'ai l'habitude d'utiliser une requête de table, je ne m'attendais pas à cette situation et j'ai été méprisé, donc j'ai carrément fait face à mon erreur, bien sûr, le principe est de parler de la mienne. L'idée n'est pas tout à fait actuelle maintenant que j'y pense, je vais donc donner le code TP correspondant ci-dessous.

// 异步请求试卷夹下某一个试卷夹的列表
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);
}

Recommandations associées :

Contraintes dans MySQL et requêtes multi-tables et exemples détaillés de sous-requêtes

python flask multi-pairesrequêtes multi-tables exemples détaillés

Syntaxe d'opération de base commune MySQL (8)~~Requête de tables multiplesFusionner les résultats et requête de jointure interne [mode ligne de commande]

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn