CakePHPで検索機能の実装を少し楽する

4月 22nd, 2008 admin Posted in CakePHP, 今日のコード |

  • 検索
  • ページング
  • ソート

この3つさえなければ僕はWebアプリが大好きです。

CakePHP1.2での簡単なやり方

CakePHP1.2ならLIKE文なんかをある程度作ってくれるのでWHER 1=1 AND...とか書かなくてOKで少しうれしいです。

コード

usernameとpasswordが入ったUserモデルとuser_idとかnameとかname_ruby,tel_mobileとかが入ったProfileモデルに対してAND検索をする例。

/admin_index.ctp

PHP:
  1. <h2>ユーザの検索</h2>
  2. <form action="<?php echo $html->url('/admin/users/index'); ?>" method="get">
  3. <table>
  4.     <tr>
  5.         <th width="20%">ログインID</th>
  6.         <td>
  7.             <?php echo $form->input('Words/username', array('size' => '20','label'=>false));?>
  8.         </td>
  9.     </tr>
  10.     <tr>
  11.         <th>名前</th>
  12.         <td>
  13.             <?php echo $form->input('Words/name', array('size' => '30','label'=>false));?>
  14.         </td>
  15.     </tr>
  16.     <tr>
  17.         <th>フリガナ</th>
  18.         <td>
  19.             <?php echo $form->input('Words/name_ruby', array('size' => '30','label'=>false));?>
  20.         </td>
  21.     </tr>
  22.     <tr>
  23.         <th>携帯電話番号</th>
  24.         <td>
  25.             <?php echo $form->input('Words/tel_mobile', array('size' => '15','label'=>false));?>
  26.         </td>
  27.     </tr>
  28. </table>
  29. <?php echo $form->submit('検索');?>

/users_controller.php

PHP:
  1. function admin_index() {
  2.         //検索ワードがあるかどうか
  3.         $conditions = null;
  4.         if(isset($this->params['url']['data']['Words'])){
  5.             $this->data['Words'] = $this->params['url']['data']['Words'];
  6.             $like = $this->_create_like_conditions($this->params['url']['data']['Words']);
  7.             $conditions = array('and' => $like);
  8.         }
  9.         $this->User->recursive = 0;
  10.         $this->set('users', $this->paginate($conditions));
  11.     }
  12.  
  13.     function _create_like_conditions($data){
  14.         $like = array();
  15.         foreach($data as $k=>$v){
  16.             $like[$k] = 'like %'.$v.'%';
  17.         }
  18.         return $like;
  19.     }

まとめ

likeのところは、or,not,in,between,regexp,<>にも対応しています。また今回はand検索でしたがもちろんorでもいけます。

みんなには嫌われているけど現場では他に選択肢がないため大活躍なジャックバウワーのような存在「PHP+CakePHP」、今日も助かったよ!

関連するエントリ

One Response to “CakePHPで検索機能の実装を少し楽する”

  1. じゃっくばうあー

Leave a Reply