初めての[CakePHP2.x]での開発、そして挫折するまで日記~その26 検索機能を付けてみる

CakePHP

CakePHP

一覧表示はできたのですが、

データを検索したいことも出てきたので

データ検索ページを作ってみました。

スポンサードリンク

検索アクションを作成

記事タイトルを検索して検索結果を

まずは検索アクションを作成します。

(例)Controller/PostController.php

public function search(){
 //リクエストがPOSTで送られたデータが空白で無ければ
   if($this->request->is('post') && $this->request->data['Search']['title'] != ""){
      //Formの値を取得
      $title = $this->request->data['Post']['title'];
      //POSTされたデータを曖昧検索
      $data=$this->Post->find('all',array(
           'conditions'=>array('title like'=>'%'.$title.'%'))
      );
      $this->set('datas',$data);
   }else{
     //POST以外の場合
     //一覧表示
     $data=$this->Post->find('all');
     $this->set('datas',$data);
   }
 }

曖昧検索を可能にするためにLike検索させています。

検索ビューを作成

次に検索画面と結果表示画面を作成します。

(例)View/Posts/search.ctp

<?php
 echo $this->Form->create('Post', array('action'=>'search'));
 echo $this->Form->input('title', array('label' => 'タイトル名を入れてください'));
 echo $this->Form->end('検索');
?>
<?php if($this->request->is('post') && $this->request->data['Search']['title']!=""){?>
 <table>
   <tr>
     <th><?php echo "ID";?></th>
     <th><?php echo "タイトル";?></th>
     <th><?php echo "作成日";?></th>
 </tr>
 <?php foreach ($datas as $data): ?>
 <tr>
    <td><?php echo h($data['Post']['id']); ?></td>
    <td><?php echo $this->Html->link($data['Post']['title'],array('action'=>'edit',h($data['Post']['id'])));?></td>
    <td><?php echo h($data['Post']['created']); ?></td>
 </tr>
<?php endforeach; ?>
 </table>
<?php }else{ ;?>
<p>検索結果がこちらに表示されます。</p>
<?php } ?>

このようにするとフォームから入れたキーワードで

データを検索して一覧表示することができます。

複数の言葉で検索する場合

今のままだと、1つの言葉での検索のみになってしまうため

スペースを打って複数の言葉で検索できるようにします。

(例)Controller/PostController.php

public function search(){
 //リクエストがPOSTで送られたデータが空白で無ければ
   if($this->request->is('post') && $this->request->data['Search']['title'] != ""){
      //Formの値を取得
      $title = $this->request->data['Post']['title'];
    //検索文字を空白(全角又は半角)で区切って配列$keywordsに代入
    $keywords = preg_split("/ |\\s/",$title);
    //配列$keywordsの数だけ繰り返して検索条件を$conditionsに代入
    foreach($keywords as $keyword){
      $conditions[] = "title like '%$keyword%'";
    }
    //POSTされたデータを曖昧検索
    $data=$this->->find('all',array(
     'conditions' => $conditions
    ));
     $this->set('datas',$data);
   }else{
     //POST以外の場合
     //一覧表示
     $data=$this->Post->find('all');
     $this->set('datas',$data);
   }
 }

フォームから来たデータを変数$keywordに代入して

preg_split()関数で、検索文字を空白で区切って配列$conditionsに代入します。

findメソッドはconditionsに配列で条件を渡せば

複数の条件でデータを取得してくれます。

(参考)
CakePHP2.1でページネーション(実践編その6)

CakePHP2 実践入門 (WEB DB PRESS plus)

新品価格
¥3,110から
(2015/1/27 23:08時点)

スポンサードリンク

コメントを残す

サブコンテンツ

このページの先頭へ