BETA

【CakePHP2】beforeFind,afterFindの使い方

投稿日:2018-12-06
最終更新:2018-12-26

CakePHP2におけるbeforeFind, afterFind(コールバックメソッド)の使い方まとめ。

コールバックメソッドとは

この機能はAppModelを含む Modelクラス に定義ができる。CakePHPのモデル処理の前後にのみ何かしらのロジックを忍ばせたい時に利用すると良い。

beforeFind, afterFindの他に以下のようなメソッドが用意されている。

  • beforeValidate
  • afterValidate
  • beforeSave
  • afterSave
  • beforeDelete
  • afterDelete
  • onError

コールバックメソッド - 2.x

それぞれの返り値に違いがあるため、確認しながら利用すると良い。

beforeFind

  • beforeFind(array $queryData)

findの操作前に呼び出される。このコールバックに渡される $queryData はconditions, fields等の、現在のクエリについての情報を持っている。

例えば 必ず status=1 のデータだけ呼び出すなど、決まりきったconditionsやfieldsを指定したい場合に用いるとよい。

例)

public function beforeFind($queryData) {  
    $queryData['conditions']['or'] = ['status' => 1];  
    $queryData['order'] = 'created desc';  
    return $queryData;  
}  

afterFind

  • afterFind(array $results, boolean $primary = false)

findの実行後に呼び出される。find後の処理を実行したり、findから返されたデータの変更・整形に用いることができる。そのためコールバックの返り値としては、findの結果(を加工したもの)にする必要がある。

例えば、以下のような配列がモデルのfindから返ってきたとする。

$results = [  
    0 => [  
        'ModelName' => [  
            'field1' => 'value1',  
            'field2' => 'value2',  
        ],  
    ],  
];  

これをafterFindによって整形する。

public function afterFind($results, $primary=false) {  
    foreach ($results as $key => $val) {  
        if(isset($val['ModelName']['hoge'])) {  
            $results[$key]['ModelName']['hoge'] = date('d-m-Y', strtotime($val['ModelName']['hoge']);  
        }  
    }  
    return $results;  
}  

$primaryは、現在のモデルがクエリ発行源のモデルかどうか、またはこのモデルがアソシエーションとして照会されたかを示している。特別なことをしない限りはfalseでOK。

beforeFind,afterFindを無効にする

callbacks を指定する。

beforeFind、afterFindどちらも無効にする場合

$this->Model->find('all', [  
    'conditions' => ['field' => $value],  
    'callbacks' => false  
]);  

片方だけ有効にする場合

$this->Model->find('all', [  
    'conditions' => ['field' => $value],  
    'callbacks' => 'after' // afterFindのみ有効  
]);  
技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

@tanakashiの技術ブログ

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる
技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
or 外部アカウントではじめる
10秒で技術ブログが作れます!