cakePHPでmodelをfindするとき、常に条件を追加したい

どうも。トクハラです。

作ってる時に、タイトルのように何回か同じパターンがあった。
複数のユーザが使用するwebサービスなんかだと他のユーザさんのデータが見えちゃったりしたら
一大事ですよね。

こういうのはテストで潰していくしかないんだろうか・・・と思ってたけど
さすがcakePHP!大好きだ!
モデルに以下を追加することで解決しました。

/**
* 共通処理
* 目的: 複数のユーザで使うことを想定しているためfindの条件に常に$user_idを付加したい
* @var array
*/
    public $user_id = 'aaa';
    public function beforeFind($queryData) {
        parent::beforeFind($queryData);
        $defaultConditions = array('MasItem.user_id' => $this->user_id);
        $queryData['conditions'] = array_merge($queryData['conditions'], $defaultConditions);
        return $queryData;
    }

 

AppController.phpではこんなふうにモデルに条件を詰めてやる。

    public function beforeFilter() {
        $this->{$this->modelClass}->user_id = $this->Auth->user('id');
    }

※コントローラ上で$this->modelClassと書くと、自分が属するモデル名が取得できるぜ!
あと、{}でくくると、文字列をオブジェクトして扱えるんだね。
昔、javaで同じことやろうとしてcastにものすごく時間がかかったことが夢のようです。

ちなみにいつものごとくstackoverflowが元ネタです。ありがとう!

http://stackoverflow.com/questions/18094375/beforefind-add-conditions

あと、共通化せずに書いてしまった過去のソースを直したくてしょうがない。
納品後だとバグというほどでもないので直せないんだよね・・・。

Leave a Comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です