ITの隊長のブログ

ITの隊長のブログです。Rubyを使って仕事しています。最近も色々やっているお(^ω^ = ^ω^)

CakePHPのisUniqueの仕様をちょっとだけ覗く

スポンサードリンク

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で除外のロジック組んでいました。。。面倒なことをしてしまった。。。