CodeLab技術ブログ

プログラミング技術まとめ

CakePHP2 ModelのbeforeFind()の謎な仕様

Cakeの・・・というよりPHPのクラスのお決まりな書き方で、オーバーライドする場合

public function beforeFilter() {
    parent::beforeFilter();
}

ていう感じで親のクラスのメソッドを呼ぶ場合が多いかと思います。

で、CakePHP2のModelのbeforeFind()で条件式を無理やり追加したいと思ったのでいろいろやってみてバグに遭遇。

public function beforeFind($query) {
    $query = parent::beforeFilter($query);
    //$queryをなんかいじって
    return $query;
}

ですが、これがうまく動かない。なぜかというと…
lib/Model/Model.php

public function beforeFind($query) {
    return true;
}

説明文を読むと、

もしfind操作が始まることを(おそらく $queryData オプションに関した決定に基づいて)望まない場合、 false を返してください。 そうでなければ、更新されたかもしれない $queryData か、findに渡したいものやそれ相応のものを返します。

つまり、基本的にはqueryを実行してもよいかどうか、trueかfalseが帰ってくるようです。
で、変更する場合は$queryを返せってことらしい。
ですのでこんな感じにすればよさそうですね。

public function beforeFind($query) {
    $ret= parent::beforeFilter($query);
    if($ret===false){
        return false;
    }else if($ret===true){
        $ret = $query;
    }
    //ここで$retの中身を改変
    return $ret;
}

コメントは受け付けていません。