Zend FrameworkのZend_Dbでレコードの検索

前回まで、ZendFrameworkのZend_Dbを使って、『レコードの追加』『レコードの更新』『レコードの削除』を行ってきましたが、アドレスから直接ID番号を打ち込んでの処理でした。実際のWebアプリケーションでブラウザから直接入力等ということはほとんどあり得ません。ですので、本日は曖昧検索で、データを抽出して、そのデータの『更新』や『削除』、又、一覧にないデータの『追加』を行うようにするために、Zend_Dbでレコードの検索について勉強したいと思います。

index.phtmlの修正

1) 検索のためのビューを作成しなければなりませんが、これは今まで一覧を表示していたindex.phtmlの上部に検索窓を作成するようにしたいと思います。

2) 下記のようにフォームを追加します。

<form id="form1" name="form1" method="post" action="">
 <table border="0">
 <tr>
 <th scope="row">タイトル</th>
 <td><label for="title"></label>
 <input name="title" type="text" id="title" /></td>
 <td><input type="submit" name="button" id="button" value="検索" /></td>
 </tr>
 </table>
 </form>

3) 続いて、TestController.phpのindexActionメソッドを修正します。POST送信された場合の処理を追加します。

4) ブラウザで確認してみます。『愛』と入力して検索ボタンを押します。『愛』という文字を含んだデータが抽出されました。

WHEREの複数条件設定

タイトル名だけの検索は出来たのですが、コンテンツ(監督や出演者名)でも検索したい場合もあります。Zend_Db_Selectでは、単に『where』を複数回呼べば、それらのものが全てANDでつながったものとして処理されます。今回は、『Title』でも『Content』でもどちらでも検索できるようにするためにOR検索をしたいと思います。この場合は『orWhere』というメソッドを使えば簡単に処理できます。

5) index.phtmlの検索名を『title』から『search』に変更します。それ以外も若干修正します。

6) TestController.phpのindexActionも変更します。

public function indexAction()
 {
 //データベースからレコードを取得する
 $select=$this->db->select()->from('dvd_collections');
//POST送信された場合の処理
 if($this->getRequest()->isPost()){
 //受け取った値を変数に代入する
 $find=$this->getRequest()->getParam('search');
 //titleとcontentの両方をOR検索する
 $select=$select->where("title like '%{$find}%'")->orwhere("content like '%{$find}%'");
 }
$result=$this->db->fetchAll($select);
 //連想配列データベース情報をセット
 $this->view->assign('result',$result);
 }

7) ブラウザで確認してみます。『チ』と入力して検索してみました。TitleにもContentにも『チ』という文字を含むデータを抽出しました。

ページ移動のリンクを作成

8) index.phtmlファイルのテーブルの一番下のあたりに新規入力のページへ移動するリンクを作成します。

<p><a href=”../test/add”>新規入力</a></p>

<p><a href=”<?=$this->url?>/test/add”>新規入力</a></p>

9) add.phtmlファイルの一番下にも、トップページへのリンクを作成します。

<p><a href=”../test”>TOPへ</a></p>

<p><a href=”<?=$this->url?>/test”>TOPへ</a></p>

更新と削除のリンクを作成

10) これでトップページ(index.phtml)から、追加ページ(add.phtml)への移動は出来るようになりました。次に更新と削除の処理を行います。これは、トップページに1列増やして、更新と削除のページへそれぞれ移動するようにします。

※上の図面は間違いですので、下記に変更して下さい。

<a href=”<?=$this->url?>/test/edit/id/<?=$row[‘id’]?>”>更新</a>

<a href=”<?=$this->url?>/test/del/id/<?=$row[‘id’]?>”>削除</a>

11) 追加挿入したテストデータを削除してみます。

12) 無事削除されました。やっとこれでWebプリケーションらしくなってきました。

本日は、以上です。

このエントリーを含むはてなブックマーク Buzzurlにブックマーク livedoorクリップ Yahoo!ブックマークに登録

トラックバック&コメント

この投稿のトラックバックURL:

コメントをどうぞ

このページの先頭へ