【cakephp】findでcontainするとき論理削除されてカラムを取得しない【失敗】
CakePHPでfindするときcontainというプロパティを設定できる。
これはアソシエーション関係にあるモデルを一緒にfindするときに設定するようなもの。
詳しくわかっていないので説明の詳細は他のサイトを見てください。
さて、このcontain便利ですがモデル毎のbeforeFindが効きません。(私の調べ方が足りないだけかもしれない)
私の実装してるアプリではDBからのデータ削除は物理削除ではなく論理削除です。
そのため、deleted=>0を設定しないと削除したつもりのデータをfindしてしまいます。
しかし、各モデル毎にdeletedを設定するのは面倒です。
そこでbeforeFindに自動でdeleted=>0を設定してくれるような関数を書いてみました。
<?php class AppModel extends Model { public function beforeFind($queryData) { $this->setDelete(&$queryData['contain']); return $queryData; } private function setDelete(&$containArray) { if (is_array($containArray)) { foreach($containArray as $key => $value) { if (ctype_upper($key[0])) { if (empty($containArray[$key]['conditions']['deleted'])) { $containArray[$key]['conditions']['deleted'] = 0; } $this->setDelete(&$containArray[$key]); } else if (is_numeric($key) && ctype_upper($value[0])) { $containArray[$value] = array(); $containArray[$value]['conditions']['deleted'] = 0; unset($containArray[$key]); } } } else { } }
lib/Cake/Behavior/ContainableBehavior.phpを編集するとうまくいきそう。