2013-06-24 37 views
5

Tôi đang cố gắng sử dụng một UUID như một khóa chính sử dụng Laravel 4.Laravel lastInsertId với UUID PK

Không tìm kiếm thông tin nhiều về chủ đề này, tôi quyết định sử dụng một kích hoạt trong MySQL để thiết lập các cột id với một giá trị của UUID() khi chèn.

Từ những gì tôi đã đọc, tôi cần phải đặt một var theo mô hình

public $incrementing = false; 

Trong cuộc di cư của tôi nộp Tôi có một cái gì đó như thế này cho mỗi bảng:

//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); 

Trong khi tôi có thể chèn một bản ghi như thế này có một UUID, tôi không thể trả về ID nếu $ incrementing = false được đặt trong mô hình.

Nếu tôi xóa biến đó và tôi đang sử dụng UUID, id được trả về là 0. Nếu tôi sử dụng số gia tăng ('id') trong tệp di chuyển, tôi sẽ trả về id thực.

Tôi đang xây dựng một ứng dụng mà UUIDs cho id trong spec, vì vậy tôi đang cố gắng tìm hiểu xem điều này là có thể trong Laravel 4.

Nếu tôi không thể nhận được id mà lại sử dụng

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

return $user->id; 

thì id sẽ được sử dụng như thế nào cho các mối quan hệ? (Vấn đề tương tự bằng cách sử dụng $ user-> save();)

Từ những gì tôi hiểu Eloquent đang mong đợi một auto_increment trở lại, nhưng nó có vẻ như có một cách để có được bất kỳ id trở lại.

Tại sao tính năng này không hoạt động?

Mọi thông tin chi tiết về lĩnh vực này sẽ được đánh giá cao vì tôi dường như không tìm thấy bất kỳ tài liệu thực nào về chủ đề này.

Trả lời

7

Tôi đã giải quyết vấn đề này bằng cách sử dụng Sự kiện creating trên Mẫu để thêm UUID mới khi Mô hình được lưu. Bạn cũng có thể tìm thấy giải pháp của tôi trên 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(); 
    } 

} 
+0

Đúng vậy, thật đáng tiếc vì trình kích hoạt trông rất đẹp. – malhal