スポンサードリンク

一覧表示はできたのですが、
データを検索したいことも出てきたので
データ検索ページを作ってみました。
スポンサードリンク
検索アクションを作成
記事タイトルを検索して検索結果を
まずは検索アクションを作成します。
(例)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)
スポンサードリンク