純粋にケーキのオプション
これを行うには多くの方法があります...
コードの侵襲性が最も低いと思うbeforeSave
のは、対応するモデルのチェックインを追加することです。
public function beforeSave() {
if (!$this->id && !isset($this->data[$this->alias][$this->primaryKey])) {
// insert
$this->data[$this->alias]['uuid'] = $this->createUUID();
} else {
// edit
// if you don't want to do anything on insert, delete this "else"
}
return true;
}
(そのコードはhereからコピーされました)。
ここで、uuid がどうあるべきか (整数、長さ、読み取り可能な単語など) について多くの詳細を提供しませんでした。しかし、それが単純な整数であると仮定しましょう。そうでない場合は、すべての変更をここで行う必要があります。同じモデルで、uuid を作成する関数を追加します。
private function createUUID() {
do {
$uuid = rand(); //any logic you want to create the uuid, a md5, substring, hash...
//check for no repetition
$help = $this->find('first', array('conditions'=>array('uuid'=>$uuid)));
} while(!empty($help));
return $uuid;
}
そうすれば、残りのコードを変更することなく、挿入時にのみ追加される一意の uuid が得られます。これは私が好きな解決策です。
これを行う別の方法としては、たとえば、値を返す UUID 関数を作成し、それを使用してafterSave
(挿入か更新かを確認)、uuid を使用してレコードを更新します ( 'それまでに、新しく作成されたレコードの ID を取得します)。
一方と他方の利点はあまりありません... beforeSave
1つはデータベースのuuidフィールドをNOT NULLとして設定できますが、を使用する場合はafterSave
、最初にレコードを挿入する必要があり、uuidはそのためにnullにする必要があります.
beforeSave
詳しくは説明しませんが、私が uuid NOT NULL を使用しているという理由だけで、このオプションをお勧めします。