#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')
$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',
];