find

Posted by muchag | CakePHP | 2011-07-01 (金) 17:41:14

CakePHP で DB からデータの抽出を行うには
find メソッドを利用する。

以前のヴァージョンでは findAll など find に接尾辞が付いたメソッドがあったが
1.3.x では、抽出種別は第1引数に設定するようになった。

【環境】
[CakePHP] 1.3.10
書式

find($type, $params)

The CakePHP 1.3 Book:3.7.3.1 find

第1引数:抽出手法
第2引数:抽出条件配列
 

抽出手法
first

1件だけ欲しい場合
または
最初の1件が欲しい場合に用いる。

  1. $this->Model->find('first', $params);
  2. print_r($result);
  3.  
  4. // output
  5. Array
  6. (
  7.     [Model] => Array
  8.     (
  9.         [id] => 1
  10.         [content] => hoge
  11.     )
  12. )

 

count

レコード数(整数型)が戻ってくる。
 

all

全レコードが戻ってくる。
たとえ結果が1件でも 0 添字の付いた配列形式で戻ってくる。

  1. $this->Model->find('all', $params);
  2. print_r($result);
  3.  
  4. // output
  5. Array
  6. (
  7.     [0] => Array
  8.     (
  9.         [Model] => Array
  10.         (
  11.             [id] => 1
  12.             [content] => hoge
  13.         )
  14.     )
  15. )

 

list

セレクトボックス等に利用しやすいインデックス付きなんだそうな。
試していないのでよくわからない。
 

threaded

nest って書いてあるから入れ子式で戻してくれるみたい。

1回試してみたら
子モデルの外部キーカラム名を parent_id にしないといけないみたい(不確か)だったので
制限が鬱陶しくて all で統一しちゃってる。
 

neighbors

全く試していないので不明だけど
マニュアルを読む限り指定した行の前後を1行ずつ取ってくるみたい。
 

抽出条件
conditions

検索条件の設定。
WHERE 句の部分。
配列可。

1回 conditon として s を付け忘れてはまった・・・orz
 

order

ORDER BY 句の設定。
 

fields

抽出カラム名の設定。
SELECT 句の部分。
配列可。
 

joins

結合の設定。

まだ1例しか確認していないが
‘fields’ も設定しないと反応しないっぽい。
 

2モデル

Parent モデル、Child モデルに対して

  1. $params = array(
  2.     'joins' => array(
  3.         array(
  4.             'table' => 'children',
  5.             'alias' => 'c',
  6.             'type' => 'INNER',
  7.             'conditions' => array('parents.id = c.parent_id'),
  8.         ),
  9.     ),
  10. );

配列が 2段 であることに注意。

table は生のテーブル名なので
prefix を設定している場合は prefix も含める。
 

3モデル以上

A ━ B ━ C であろうが
A ┳ B
◇┗ C であろうが
並列でいけるようだ。
ちゃんと試していない。

Parent モデル、Child モデル、GrandChild モデルに対して

  1. $params = array(
  2.     'joins' => array(
  3.         array(
  4.             'table' => 'children',
  5.             'alias' => 'c',
  6.             'type' => 'INNER',
  7.             'conditions' => array('parents.id = c.parent_id'),
  8.         ),
  9.         array(
  10.             'table' => 'grand_children',
  11.             'alias' => 'g',
  12.             'type' => 'INNER',
  13.             'conditions' => array('c.id = g.parent_id'),
  14.         ),
  15.     ),
  16. );

 

種類

うっかり消してしまい出展を載せられないが
どこかのサイトで
LEFTINNER しか設定できない
と書いてあった。
試していないので、ただの覚書。
 

group

カラム名を指定して、当該カラムの重複データをまとめる設定。
GROUP BY 句の部分。

paginator と併用する場合には一工夫必要。
paginator.php GROUP BY との併用
 

limit

抽出レコード数上限値。
LIMIT 句の部分。
 

recursive

アソシエーションの階層数の設定。

デフォルトは 1 に設定されている。

  • -1 アソシエーション解除
  • 0 自分のみ
  • 1 1階層下位モデルまで
  • 2 2階層下位モデルまで
  • ・・・

 

callbacks

不明。

CakePHP | 2011-07-01 (金) 17:41:14 |

コメントはまだありません »

No comments yet.

RSS feed for comments on this post. TrackBack URI

Leave a comment