6

Laravel 4 を使用して UUID を主キーとして使用しようとしています。

このトピックに関する多くの情報が見つからないため、MySQL でトリガーを使用して、挿入時に UUID() の値で id 列を設定することにしました。

私が読んだことから、モデルに変数を設定する必要があります

public $incrementing = false;

私の移行ファイルには、各テーブルに次のようなものがあります。

//set default id to UUID, requires thread_stack in my.cnf to be 196k
function makeTrigger($tableName)
{
    DB::unprepared('CREATE TRIGGER '.$tableName.'_trigger_id BEFORE INSERT ON '.$tableName.' FOR EACH ROW SET NEW.id = UUID()');
}

$tableName = 'sites';
Schema::create($tableName, function($table)
{
    $table->string('id', 36)->primary();
    $table->string('name', 50);
    $table->string('development_url', 50);
    $table->string('production_url', 50);
    $table->boolean('launched')->default(0);
    $table->string('test');
    $table->timestamps();
    $table->softDeletes();
});
makeTrigger($tableName);

このような UUID を持つレコードを挿入することはできますが、モデルで $incrementing = false が設定されている場合、ID を返すことはできません。

その var を削除し、UUID を使用している場合、返される ID は 0 です。移行ファイルで increments('id') を使用すると、実際の ID が返されます。

仕様でIDのUUIDを作成するアプリを構築しているため、Laravel 4でこれが可能かどうかを調べています.

を使用してそのIDを取り戻すことができない場合

$user = User::create($userdata);

return $user->id;

では、id は関係にどのように使用されるのでしょうか? ($user->save(); を使用した同じ問題)

私が理解していることから、Eloquentはauto_incrementが返されることを期待していますが、IDを返す方法があるはずです。

なぜこれがうまくいかないのですか?

このトピックに関する実際のドキュメントが見つからないように見えるため、この分野に関する洞察をいただければ幸いです。

4

1 に答える 1

8

creatingモデルのイベントを使用して、モデルが保存されたときに新しい UUID を追加することで、これを解決しました。私の解決策はpackagistでも見つけることができます。

class BaseModel extends Eloquent {

    /**
     * Indicates if the IDs are auto-incrementing.
     *
     * @var bool
     */
    public $incrementing = false;

    /**
     * The "booting" method of the model.
     *
     * @return void
     */
    protected static function boot()
    {
        parent::boot();

        static::creating(function($model)
        {
            $model->{$model->getKeyName()} = (string)$model->generateNewId();
        });
    }

    /**
     * Get a new version 4 (random) UUID.
     *
     * @return \Rhumsaa\Uuid\Uuid
     */
    public function generateNewId()
    {
        return \Rhumsaa\Uuid\Uuid::uuid4();
    }

}
于 2013-09-16T14:33:03.193 に答える