1

主キーが自動増分整数のテーブルがあります。テーブルには、実世界のオブジェクトのデータが保持されます。

ここで、各行に uuid を設定します。主キーを変更したくありません。しかし、割り当てられた uuid が上書きされないことを絶対に確認したい (したがって、更新ではなく、挿入時にのみ UUID を作成する)

この uuid を QR コードとして使用したいので、主キーと同じようにレコードに対して一意である必要があります。

これを行う方法はありますか?

(cakePHP2を使っているので作成したタイムスタンプのような挙動かもしれません。これも元のINSERTでしかできません)

4

2 に答える 2

2

純粋にケーキのオプション

これを行うには多くの方法があります...

コードの侵襲性が最も低いと思う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 を取得します)。

一方と他方の利点はあまりありません... beforeSave1つはデータベースのuuidフィールドをNOT NULLとして設定できますが、を使用する場合はafterSave、最初にレコードを挿入する必要があり、uuidはそのためにnullにする必要があります.

beforeSave詳しくは説明しませんが、私が uuid NOT NULL を使用しているという理由だけで、このオプションをお勧めします。

于 2013-08-06T20:30:21.640 に答える