LoginSignup
110
123

More than 5 years have passed since last update.

【CakePHP】findメソッド

Last updated at Posted at 2014-02-21

findのオプション

find('all',array(
    'fields' => array('Model.field1','Model.field2'), //取得するカラム。配列指定。
    'conditions' => array('Model.field' => $thisValue), //検索条件。カラムと値を連想配列で指定。
    'order' => array('Model.created', 'Model.field3 DESC'), //並び順。文字列または配列で指定。
    'group' => array('Model.field'), //group byするカラム。
    'limit' => 2, //limit句。数値で渡す。
    'recursive'=>-1//
))

recursiveについて

-1 : JOINしない。自分だけとってくる。
0 : 自分と自分がbelongsToしているモデルだけとってくる。
1 : 自分とbelongsToとHasManyをとってくる。
2 : 自分とbelongsToとHasManyと、BelongsToとHasMany先が関連しているモデルを一階層分とってくる。

デフォルトは1

joinする場合

$this->Hoge->find('all', [
  'joins'=>[
    [
      'type' => 'inner',
      'table' => 'fuga_table',
      'alias' => 'Fuga',
      'conditions' => [
        'Fuga.id = Hoge.id',
      ],
    ],
    [
      // 複数のテーブルを joinできる
    ],
  ]
]);

該当レコードが存在しない場合のチェック方法

array()が返るので、取得チェックはemptyで行う。

レコードが取得できたかのチェック
$hoge = $this->find('all');
if(empty($hoge)){
  //取得できなかった場合の処理
}

find('list')

key,value形式で値を取得できるため、セレクトボックスを作るときに便利。

デフォルトでは、idカラムがkeyで、nameカラムがvalueになる。

基本形
$res = $this->find('list',array(
  'conditions'=>array('hoge'=>'huga')
));

var_dump(res);
/*
idカラムがキー、nameカラムがvalueで取得できる。
array(
  1=>'aa',
  2=>'bb',
  3=>'cc'
)
*/

keyはidで、valueをデフォルトのnameやtitle以外のカラムを使いたい場合は、displayFieldプロパティを使用する。

$this->displayField = 'valueに使用するカラム名';
$res = $this->find('list');

var_dump($res);
/*
array(
  1=>'aa',
  2=>'bb',
  3=>'cc'
)
*/

keyとvalueに対応するカラムを設定したい場合は、fieldsに設定する。

$res = $this->find('list',array(
  'fields' => array(keyにあたるカラム,valueにあたるカラム),
  'conditions'=>array('hoge'=>'huga')
));

var_dump($res);
/*
array(
  'A'=>'aa',
  'B'=>'bb',
  'C'=>'cc'
)
*/

find('count')

find('count')
$cnt = $this->find('count',array(
  'conditions'=>array('hoge'=>'huga')
));

var_dump($cnt);
//=>671  件数がそのまま返る。

最大値の取得

$max = $this->find('first',array(
  'fields'=>array('max(age) as age_max'),
  'conditions'=>array('hoge'=>'huga')
));

var_dump($max);
/*
array(
  0=>array(
    'age_max'=>'20'
  )
)
*/

バーチャルフィールドを使った方が楽。
【CakePHP】バーチャルフィールド

複数のorをandでつなげる場合

正しい例

配列でくくると良い。

正しい例
$conditions = [
  [ 'or' => ['name'=>'hoge', 'age'=>'20']],
  [ 'or' => ['name'=>'foo', 'age'=>'30']],
];

誤った例

これだとorが上書きされてしまう。

誤った例
$conditions = [
  'or' => ['name'=>'hoge', 'age'=>'20'],
  'or' => ['name'=>'foo', 'age'=>'30'],
];

参考:find で複数の or を and でつなげる連想配列

同一カラムに条件をつける場合

正しい例

配列でくくると良い。

正しい例
$conditions = [
  [ 'name'=>'hoge'],
  [ 'name'=>'foo'],
];

誤った例

これだと上書きされてしまう。

誤った例
$conditions = [
  'name'=>'hoge',
  'name'=>'foo',
];

参考:findで複数のORを使う場合はarrayで囲む

110
123
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
110
123