Maison  >  Article  >  développement back-end  >  Exemple de méthode de requête multi-table thinkPHP

Exemple de méthode de requête multi-table thinkPHP

小云云
小云云original
2018-02-10 10:35:521227parcourir

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 de l'affichage paginé des résultats de la requête sur la base d'exemples spécifiques. ça. J'espère que ça peut aider tout le monde.

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 publication de la feuille de réponses associée à l'épreuve. , le papier de test peut être recherché dans le papier de test du système en même temps. D'autres enseignants peuvent également le 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, requêtes multi-tables et sous-requêtes dans MySQL détaillées explication des exemples

Requête multi-table ThinkPHP - si le champ A est le même, ajoutez le champ B_PHP tutoriel

notes d'étude thinkphp Multi-table requête, thinkphp Study Notes_PHP tutoriel

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