libro
www.tuyano.com
初心者のためのCakePHP2 プログラミング入門

クエリー、マジック検索、AND/OR検索 (3/3)

作成:2011-12-05 07:57
更新:2011-12-06 19:56

■クエリー検索について

より複雑な検索指定などを必要とする場合、いちいちメソッドだのオプションの設定だのということを考えるより、「いいからクエリーをそのまま実行させてくれ!」と思ってしまうことも多いかも知れません。SQLデータベースはクエリーを発行して操作するのですから、CakePHPの中から直接クエリーでやり取りできればそれが一番手っ取り早いのはたしかでしょう。

ただし、この方法には問題点もあります。まず、直接クエリーを実行するわけですから、データベースアクセスへの攻撃を行うSQLインジェクションなどへの対策をすべて自前で用意しなければいけません(findメソッドなどを利用する限り、こうした対策はすべてCakePHP側で処理してくれます)。

なにより、せっかくCakePHPというフレームワークを使い、データベースアクセスを抽象化しているのに、その努力が無駄になってしまうということを理解しておきましょう。SQLクエリーはデータベースによって微妙に違いがありますから、使用するデータベースにあわせてクエリーを書かなければいけませんし、データベースを変更する際にはクエリーの修正も必要になるなど、CakePHPを利用せず直接データベースアクセスを行った時の問題がそのまま引き継がれてしまうことになります。

さて、このクエリーの実行ですが、これはModelクラスの「query」というメソッドで行うことができます。これは以下のように呼び出します。
$変数 = $this->Modelクラス->query( クエリーテキスト );
非常にシンプルですね。では実際の利用例として、先ほどのfindメソッドをqueryで書き換えたものを下に掲載しておきましょう。ここでは、namelike検索を行なっています。フィールドにテキストを書いて検索すると、nameにその文字を含むデータすべてを検索します。ここでは、
select * from my_sample_data where name like '%{$str}%';
このようにクエリーを作成しています。likeを利用することで、完全一致する項目のみならず、そのテキストを含むものであればすべて取り出すようになります。――このあたりは、SQLについて勉強しないとちょっとわかりにくいかも知れません。queryを使いこなすためには、そうしたSQLデータベースの知識が不可欠となる、ということは理解しておきましょう。


※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

※findメソッドの修正

  public function find(){
    // レイアウト関係
    $this->layout = "Sample";
    $this->set("header_for_layout", "Sample Application");
    $this->set("footer_for_layout", 
         "copyright by SYODA-Tuyano. 2011.");
    // post時の処理
    if ($this->request->is('post')) {
      $str = $this->request->data('MySampleData.name');
      $data = $this->MySampleData->query
        ("select * from my_sample_data where name like '%{$str}%';");
      $this->set('data',$data);
    }
  }

※関連コンテンツ

「初心者のためのCakePHP2 プログラミング入門」に戻る