Save()時に指定するフィールドリストをブラックリスト方式に

これはナイス記事。
Blacklist your model fields for save()


CakePHPのModelでsave()をするとDBにデータを保存できるのですが、Postされたデータをそのままsaveに突っ込むと、思わぬフィールドまで変更がかかってしまう危険があります。これを避けるためにDB登録前に登録データをフィルタしたり、saveの引数で、登録可能なフィールド(カラム名)を配列で指定する対応があります。


Saveの引数でフィルタする場合は、DBのフィールド名を列挙した配列を与えれば、そこで指定されたフィールド以外はDBに登録されません(ホワイトリスト

ただ、これってフィールドがたくさんあった場合、列挙するのが面倒だし、たぶん登録するカラムよりも登録を防ぎたいカラムのほうが少ないことが多いと思います。ということで、登録を防ぎたいフィールドを指定してsaveする方法

$blackList = array('protected', 'fields', 'here');
$this->Model->save($this->data, true, array_diff(array_keys($this-> Model->schema()), $blackList);

便利!!


追記:
この記事のコメント欄でBlack list と White Listの議論があります。whitelistにしとけば、指定したフィールド以外は変更されないので、もしテーブルにカラムを追加した場合にフィールド指定の変更を忘れても情報が欠落するだけだからリスクは小さいという意見があります。Black listだとカラム追加し、そのカラムを変更されたくない場合は、フィールド指定を忘れないように!!
saveの前にblack listのフィールドをunsetすればいいんじゃない?という意見もあります。