AkActiveRecord::find

AkelosActiveRecordのメモ.

find()

基本のfind.

第一パラメータに"first","all"などの取得条件を指定.第二パラメータには配列でオプションを指定する.オプションは以下の通り.

  • conditions
    • SQLのWHERE区.いくつか指定方法あり
      • 配列 : キーと値がペアになった連想配列.基本的に"="で連結される.単純なデータ取得にはいいかも.
      • バインド形式 : 普通の配列で指定するが,0番目の値に"user_id = ?"などとSQLを書く.その後に続く値でuser_idの実値を書く."array("user_id = ?", 1)"とか
      • バインドその2 : 最初にSQLを書いて,その後にSQL中に埋め込んだキーワードと同じキーの値をバインドする.array("user_name = ':user_name'", ':user_name' => 'updoor');
  • limit
    • SQLのLIMIT区.何件分のデータを取得するかを指定.
  • offset
    • SQLのOFFSET区.取得するデータがどこから始まるかを指定
  • order
    • SQLのORDER区."id desc"みたいな.
  • include
    • アソシエーションを自動読み込み(後述)

ちなみに"find()"では単純にidを一つでも,複数並べた形でもデータの取得ができる.

$Model->find(1, 2, 3);

結果が複数ある場合には,モデルの配列で結果が返ってくる."first"を指定した場合には一番最初の結果のモデルが返ってくる.

findの"include"オプション

基本的にはアソシエーションを指定したモデルの名前を書く.例えばUserモデルとGroupモデルが繋がっている場合.Userは一つのGroupに属する,逆にグループには複数のUserが属するってなときは,
Userモデル

$belongs_to = 'group';

Groupモデル

$has_many = 'users';

な感じで結びつく.

このとき,とあるグループを取得するときについでに社員一覧とかを取るとすると

$group = $this->Group->find('first', array(
  'conditions' => array('id = ?', 1),
  'include' => 'users'
))

といった形で書ける.通常ならアソシエーションを読み込むときには"load"で読む必要があるけど,includeオプションをつけることで自動的に取ってきてくれる.

findAll()

"find('all')"のラッパー.内部的にもパラメータの一番最初に"all"指定を付け加えて,"find()"メソッドを実行.

findFirst()

"find('first')"のラッパー.内部的にもパラメータの一番最初に"first"指定を付け加えて,"find()"メソッドを実行.

findBy()

find()のconditionsオプションをいろいろ柔軟に指定できるよ.ってな感じっぽい.

コード中の例によると下記みたいな指定ができる.

findBy('username AND password', $username, $password);
findBy('age > ? AND name:contains', 18, 'Joe');
findBy('is_active = true AND session_id', session_id());

最初の引数に"all"か"first"をつける.付けない場合にはデフォルトで"all"が指定される.
これにfind()の時みたいにオプションを指定した場合には,引数の最後に配列で指定してあげる.

findAllBy(args)

findBy('all', args);

findBy

findFirstBy()

findBy('first', args);

findLastBy()

findFirstBy()の逆で最後のデータを取得.内部的に"findFirstBy()"を実行する前にorderに"desc"を指定している.

findBySql()

SQL直指定して結果を取得.
モデルに存在しないカラムは弾かれてるっぽい.


と簡単にまとめてみる.
これ違うとかこんな使い方もあるよってな突っ込みやらアドバイスお待ちしておりマス.