LoginSignup
34
28

More than 5 years have passed since last update.

【CakePHP】レコードの存在確認

Last updated at Posted at 2015-02-26

今までレコードの存在確認に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へのキャスティング

34
28
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
34
28