cakephpのバリデーションでisUnique
ってありますよね。
同じ値が他のレコードに存在していた場合、エラーを返してくれるやつです。
使っているとちょっと疑問に思ったことがあって、例えば、nameが"アイパー"で登録されているレコードを更新しようとした場合、nameを変更しなければ更新使用しているレコードに登録されているのは"アイパー"であるよね。これはバリデーションに引っかからないのかなんてことを疑問に思った。
まぁもし自分が実装するのなら、更新する場合はidを比較すれば避けられるよね。って思ったのだが、とりあえずソース読んで見る。
環境は
cakephp2.8
~/lib/Cake/Model/Model.php
<?php ... // 3389行目ぐらい public function isUnique($fields, $or = true) { ... if ($or) { $fields = array('or' => $fields); } // idが存在しない => updateだった場合、同じidであれば、除外するようにする if (!empty($this->id)) { $fields[$this->alias . '.' . $this->primaryKey . ' !='] = $this->id; } // 同じ値があると1以上の値になる。PHPでは0以外はbooleanでtrueになるので、それの反対でfalseが返る return !$this->find('count', array('conditions' => $fields, 'recursive' => -1)); }
見る限り、やっぱり検索から除外されていますね。よかった。 ※PHPStormやばいな。Shift2回タイプして「isUnique」で検索したら速攻引っかかった。
っていうか、このバリデーションしらずにControllerで除外のロジック組んでいました。。。面倒なことをしてしまった。。。