test

CakePHP Note

レコードの検索

UPDATE:2009.12.17

レコードの検索はfindメソッドを使用します。findメソッドでは検索のタイプを指定し、必要に応じてオプションを指定します。

  • find(string $type, array $options)

検索のタイプ

検索のタイプは以下のいずれかを指定できます。

  • all(全てのレコード)
  • first(最初のレコード)
  • count(レコード数)
  • list(リスト表示用の配列を取得)
  • neighbors(前後のレコード)
  • threaded(親子関係のレコード、ツリー状にネストされた配列を取得できる)

検索条件

検索条件は、テキストまたは配列で指定します。カラム名はテーブルが結合されるケースを想定して'Post.title'のように'モデル名.カラム名'とするのが良いです。

テキストで指定する

$option['conditions'] = "Post.title = 'cake' ";
$this->Post->find('all',$option); 

配列で条件を組み立てる

検索条件の基本はカラム名をキーにした配列を作っていきます。

$option['conditions'] = array('Post.title' =>'cake');
$this->Post->find('all',$option); 

演算子

<>, LIKE, BETWEEN, REGEXなどの演算子をカラム名の後に置いて使用できます。

array("Post.title <>" => "cake")
array("Post.created >=" => "2009.1.1")
array("Post.level BETWEEN ? AND ?" => array(3,5))

IN演算子

値を配列で渡すとIN演算子が使用されます。

array("Post.title" => array("cake","cola","potate"))


論理演算子

AND, OR, NOT, XOR,その他の論理演算子を使用できます。

AND検索

配列を増やせばAND検索になります。

array
(
"Post.title" => array("cake","cola","potate"),
"Post.subtitle" => "Framework"
)

OR検索

orというキーに複数の条件を与えるとOR検索になります。

array
("or" =>
    array
            (
            "Post.title" => array("cake","cola","potate"),
            "Post.subtitle" => "Framework"
            )
)

グループ化(Group By)

$option['group'] = array('Post.id');


ソート順の指定

検索条件と同様に、テキストまたは配列で指定します。

$options['order'] = array("Post.created" => "ASC", "Post.title" => "DESC");
$this->Post->find('all',$option); 

フィールドの指定

取得するフィールドを限定したい時は、配列で指定します。

$options['fields'] = array('Post.created','Post.title');
$this->Post->find('all',$option); 


検索タイプが'list'の場合はkey=>valueの配列を取得します。次の通り

  1. 指定しない(idとdisplayFieldで指定したフィールドのデータを取得)
  2. 1つ指定(idと指定したフィールドのデータを$id=>$filedで取得)
  3. 2つ指定(指定したフィールドのデータを$fieldA=>$fieldB取得)
  4. 3つ指定(指定したフィールドのデータを$fieldC =>($fieldA=>$fieldB)で取得

アソシエーションの指定

同時にどのレベルまで関連レコードを取得するか指定します。

$options['recursive'] = 2;
$this->Post->find('all',$option); 

結合するテーブル

結合したいテーブルを明示的に指定します。typeにはSQLでJOINの前に記述するキーワード(INNER,LEFT等)を指定します。
$options['joins'][]=array(
'type' => 'LEFT',
'alias' => 'User',
'table' => 'users',
'conditions' => 'User.id = Post.user_id');

findByフィールド名

findById, findByTitleなどfindByフィールド名というメソッドで検索する事も出来ます。

$this->Post->findById(7);