CakePHP2.1のfindメソッド

CakePHPのScaffoldを使えばModelに関してほとんど何も分からない状態でもデータの作成(create)、読み出し(read)、更新(update)、削除(delete)が出来て便利なのですが、実際のサイト上で、このような使い方をすることはほとんど無く、データベーステーブルの一部を抽出して、他のテーブルとJOINしたりして利用します。そのためには、CakePHPのモデルについて知っておく必要があります。ですので、今日は、CakePHP2.1のModelクラスのfindメソッドに関して少し勉強してみたいと思います。

1. 以前作成してあったテーブルをCakePHP用にmovie_collectionsとリネームして使います。

2. 次にコントローラを作成します。扱うテーブル名がmovie_collectionsですので、コントローラはMovieCollectionController.php名で作成します。

app/Contoroller/MovieCollectionController.php

<?php
class MovieCollectionController extends AppController{
 function index(){
 $results = $this->MovieCollection->find('all');
 $this->set('results',$results);
 }
}

3. ビューファイルも作成します。とりあえずタイトル名だけを一覧表示するようにしてみました。

app/View/MovieCollection/index.ctp

<ul>
<?php foreach($results as $result):?>
<li><?php echo $result['MovieCollection']['title']?></li>
<?php endforeach;?>
</ul>

3. ブラウザで確認してみます。登録されている全てのデータが表示されました。

http://ドメイン名/movie_controller/

findメソッド

4. findメソッドは、$this->モデル名->find(‘検索タイプ’,’オプション値’);でモデルからデータを取り出します。

5. 検索タイプは、標準で下記の値が用意されています。

  • all
    条件に合致する全てのデータを取り出します。
  • first
    最初に見つかったデータのみを取り出します。
  • list
    指定したフィールドのデータをリスト化して取り出します。
  • threaded
    そのレコードの親子関係を解析し、子レコードを階層で取得することが出来ます。
  • neighbours
    該当レコードの隣り合ったレコードの情報を取得できます。連想配列で『prev』キーの値は該当レコードの前のレコード、『next』には後のレコードが格納されます。

6. オプション値には下記の値を設定することが出来ます。

  • fields
    取得するフィールドを配列で指定します。値は、『フィールド名』又は、『モデル名.フィールド名』で指定します。
    例:’fields’=>array(‘id’,’title’,’MovieCollection.content’)
  • conditons
    検索条件を連想配列で指定します。キーは、『モデル名.フィールド名 [演算子] 』又は、『フィールド名[演算子]』とし、値は検索値を指定します。演算子のデフォルトは『=』ですので、演算子を指定しなければ『=』が適用されます。キーを『and』『or』とした連想配列を指定することで、指定した検索条件を絞り込むことが出来ます。これらのキーを用いずにフィールド条件を列挙した場合は『and』と見なされます。
    例: ‘conditions’=>array(‘id’=>5), は、idが5のデータを抽出します。
    例2:’contidons’=>array(id <‘ =>5), は、idが5未満のデータを抽出します。
  • order
    検索されたデータのソート順を連想配列で指定します。キーはフィールド名(または、モデル名.フィールド名)とし、値は昇順『asc』、降順『desc』を指定します。
    例:’order’ => array(‘id’ => ‘desc’)
  • recursive
    取得するアソシエーションの範囲を指定します。-1の場合、自分自身のみを取得します。0の場合、-1の範囲のほか、hasOneのアソシエーションを取得します。1の場合、oの範囲のほか、hasAndBelongsToMany、もしくは1で取得できたアソシエーションが持つhasOne、hasMany、belongsToのアソシエーションを取得します。
  • joins
    JOINを配列で下記のように指定します。
    type:JOINの方法を指定します(LEFT/RIGHT/INNER/OUTER)
    table:JOINするテーブル名
    alias:エイリアス名
    conditions:追加の検索条件『JOIN~ON』以降にくるSQL
  • group
    GROUPを配列で指定します。
  • contain
    Containableビヘイビアが指定されている場合は、ここに列挙することで必要な関連データのみを取得することができます。

7. コントローラとビューを下記のように修正します。テーブルを一つしか作っていないので、アソシエーションやJOINを使ったコードの検証はできていませんが、findメソッドの使い方は一応分かると思います。。

app/Controller/MovieCollectionController.php

<?php
 class MovieCollectionController extends AppController{
 function index(){
 $results = $this->MovieCollection->find('all',array(
 //フィールド名のid,title,contentを選択
 'fields'=>array('id','title','MovieCollection.content'),
 //idが5以上100未満
 'conditions'=>array('id >='=>5,'id <'=>100),
 //降順で整列
 'order'=>array('id'=>'desc'),
 ));
 $this->set('results',$results);
 }
 }

app/View/MovieCollection/index.ctp

<ul>
 <?php foreach($results as $result):?>
 <li>
 <?php echo $result['MovieCollection']['id']?> -
 <?php echo $result['MovieCollection']['title']?><br>
 <?php echo $result['MovieCollection']['content']?>
 </li>
 <?php endforeach;?>
 </ul>

8. ブラウザで確認してみます。5以上100未満のデータが降順で並んでいます(画像の説明は昇順となっていますが、降順の間違いです)。

9. ちなみに、conditionsの演算子にlikeを指定して、文字列を%で囲むことであいまい検索をすることができます。下記の部分を修正してブラウザで確認してみます。

‘conditions’=>array(‘title like’=>”%愛%”),

本日は以上です。

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

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

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

トラックバック

コメント


コメントをどうぞ

このページの先頭へ