モデルを更に考える (1/7)
作成:2010-02-18 16:29
更新:2010-05-10 20:00
更新:2010-05-10 20:00
■特定の項目で検索をする
前回、モデルを用意してデータベースの基本的な操作(一覧表示、データの追加)をやってみました。今回は、更にモデルの利用について理解を深めていきましょう。
まずは、「検索」についてです。前回、findメソッドを使ってすべてのデータを取得する、というのはやりましたが、特定のデータだけを検索して取り出す、というのはどうすればよいのでしょうか。
これにはいくつかやり方があります。まず、一番簡単なのは「findAllBy~」「findBy~」といったメソッドを利用するものです。これは、以下のように利用します。
例えば、「id」という項目の値が「1」のデータを取り出したいという場合、「findAllById(1)」というようにモデルのメソッドを呼び出すと、そのデータが取り出されます。「name」の値が「太郎」のものなら、「findAllByName("太郎")」となるわけです。
「findAllBy~」と「findBy~」の違いは、前者が検索されるすべてのデータを返すのに対し、後者は検索された最初の1つだけを返す、という点です。両者の違いは、実は意外に大きいのです。なぜなら、得られるデータの数だけでなく、「返されるデータの構造」が違うからです。
findAllBy~は、前回やったfindなどと同様に、配列の中に各データがまとめられます。が、findBy~のほうは、(常に1つしかデータをとらないので)配列ではなく、得られたデータがそのまま返されます。このため、返されたデータを扱う場合、構造の違いをきちんと理解して處理する必要があります。
では、簡単なサンプルをあげておきましょう。前回作成したMydataContrllerのindexアクションを修正して、ID番号を送信するとそのIDのデータだけを検索するようにしてみましょう。下に、コントローラーのindexアクションと、index.ctpテンプレートのソースコードを上げておきます。それぞれ書き換えて試してみましょう。
まずは、「検索」についてです。前回、findメソッドを使ってすべてのデータを取得する、というのはやりましたが、特定のデータだけを検索して取り出す、というのはどうすればよいのでしょうか。
これにはいくつかやり方があります。まず、一番簡単なのは「findAllBy~」「findBy~」といったメソッドを利用するものです。これは、以下のように利用します。
$変数 = モデル->findAllBy項目 ( 値 );データベースには、値を保管する項目がいくつかあります(一般に、コラムとかフィールドとか呼ばれます)。モデルには、特定の項目の値を指定して検索するためのメソッドが自動生成されます。
例えば、「id」という項目の値が「1」のデータを取り出したいという場合、「findAllById(1)」というようにモデルのメソッドを呼び出すと、そのデータが取り出されます。「name」の値が「太郎」のものなら、「findAllByName("太郎")」となるわけです。
「findAllBy~」と「findBy~」の違いは、前者が検索されるすべてのデータを返すのに対し、後者は検索された最初の1つだけを返す、という点です。両者の違いは、実は意外に大きいのです。なぜなら、得られるデータの数だけでなく、「返されるデータの構造」が違うからです。
findAllBy~は、前回やったfindなどと同様に、配列の中に各データがまとめられます。が、findBy~のほうは、(常に1つしかデータをとらないので)配列ではなく、得られたデータがそのまま返されます。このため、返されたデータを扱う場合、構造の違いをきちんと理解して處理する必要があります。
では、簡単なサンプルをあげておきましょう。前回作成したMydataContrllerのindexアクションを修正して、ID番号を送信するとそのIDのデータだけを検索するようにしてみましょう。下に、コントローラーのindexアクションと、index.ctpテンプレートのソースコードを上げておきます。それぞれ書き換えて試してみましょう。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
●プログラム・リスト●
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | ※MydataControllerクラスのindexメソッドの修正 function index(){ $this ->set( "page_title" , "Sample Page" ); $this ->set( "content_header" , "Sample Page." ); $this ->set( "content_footer" , "copyright SYODA-Tuyano. 2010." ); if (! empty ( $this ->data)){ $datas = $this ->Mydata->findAllById( $this ->data[ "Mydata" ][ "FIND" ]); } else { $datas = $this ->Mydata->find( "all" ); } $this ->set( "datas" , $datas ); } ※index.ctpの修正 <h1>データの一覧リスト</h1> <?php echo $form ->create( "Mydata" , array ( "type" => "post" , "action" => "./index" )); ?> <?php echo $form ->input( "FIND" ); ?> <?php echo $form -> end ( "送信" ); ?> <table> <tr><th>名前</th><th>メール</th><th>電話</th></tr> <?php foreach ( $datas as $data ){ ?> <tr> <td><?php echo $data [ 'Mydata' ][ 'name' ]; ?></td> <td><?php echo $data [ 'Mydata' ][ 'mail' ]; ?></td> <td><?php echo $data [ 'Mydata' ][ 'tel' ]; ?></td> <?php } ?> </tr> </table> |
※関連コンテンツ
「初心者のためのCakePHP 1.3 プログラミング入門」に戻る