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の配列を取得します。次の通り
- 指定しない(idとdisplayFieldで指定したフィールドのデータを取得)
- 1つ指定(idと指定したフィールドのデータを$id=>$filedで取得)
- 2つ指定(指定したフィールドのデータを$fieldA=>$fieldB取得)
- 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);
