栃木県のJavaエンジニア、WEBプログラマーのためのサイト

2015.02.25[CakePHP] カスタムfindをつくる

カスタムfind

カスタムfindをつくるとクエリや実行結果を加工することが出来ます。

早速、Userモデルで論理削除されていないものを検索出来る enable を作ってみます。
disabled_at が ‘0000-00-00 00:00:00′ 以外だと論理削除とします。

CREATE TABLE users (
  id INTEGER PRIMARY KEY AUTO_INCREMENT,
  login_id VARCHAR(255) NOT NULL UNIQUE,
  password_hash VARCHAR(255) NOT NULL,
  disabled_at DATETIME DEFAULT '0000-00-00 00:00:00',
  created_at DATETIME DEFAULT '0000-00-00 00:00:00',
  updated_at DATETIME DEFAULT '0000-00-00 00:00:00'
);

findメソッドの定義は以下のようになっています。
カスタムfind は $type の種類を増やす形になります。

public function find($type = 'first', $query = array())

まず、$type に新しいfind種別 enable を追加します。

class User extends AppModel {
    public $findMethods = ['enable' =>  true];
}

次に、find種別 enable に対応するメソッド _findEnable を定義します。
メソッド名は _find + find種別名(先頭大文字)のルールになります。

class User extends AppModel {
    public $findMethods = ['enable' =>  true];

    protected function _findEnable($state, $query, $results = array()) {
        if ($state === 'before') {
            // クエリ加工は before
            $query['conditions']['User.disabled_at'] = '0000-00-00 00:00:00';
            return $query;
        }
        if ($state === 'after') {
            // 結果加工は after
            return $results;
        }
    }
}

$state はクエリの状態で、クエリ実行前は before、 実行後は after です。
なので、クエリを加工したい場合は before で、$query を加工します。
結果を加工したい場合は $results を加工します。

使う場合は $type に enable を渡します。

$enableUsers = $this->User->find('enable');

今回はクエリ加工のみでしたは、例えば JSON 作成用に連想配列からモデル名を取り除いた結果が欲しい場合など after で加工するとよいです。

参考