今までレコードの存在確認にfind('count')を使っていたけど、コードがすっきりするので、プライマリーキーを条件にするならModel->exists()を使い、それ以外を条件にするならModel->hasAny()を使うようにする。
Model->exists()
パラメータ:プライマリーキー
戻り値:存在したらtrue、存在しなかったらfalse
if($this->exists($id)){
//レコードが存在した場合の処理
}else{
//レコードが存在しない場合の処理
}
exists関数の中を見ると、なんとfind('count')している。単にラップしてるだけですね。
public function exists($id = null) {
(パラメータチェックのため記載省略)
return (bool)$this->find('count', array(
'conditions' => array(
$this->alias . '.' . $this->primaryKey => $id
),
'recursive' => -1,
'callbacks' => false
));
}
Model->hasAny()
アソシエーションのhasManyと紛らわしいの注意。
パラメータ:連想配列でcountの条件。findのconditon形式。
戻り値:存在したらtrue、存在しなかったらfalse
$conditions = array('status'=>'1');
if($this->hasAny($conditions)){
//レコードが存在した場合の処理
}else{
//レコードが存在しない場合の処理
}
hasAny関数の中を見るとこちらもfind('count')している。
こちらも単にラップしてるだけですね。
public function hasAny($conditions = null) {
return (bool)$this->find('count', array('conditions' => $conditions, 'recursive' => -1));
}
蛇足
ソースを見て初めて知ったけど、PHPではintをbooleanにキャストすると、0はfalseで、0以外は全てtrueにキャストされるらしい。
参考:booleanへのキャスティング