2016-03-04 23 views
6

Tôi có bảng mysql trong đó tôi đang sử dụng UUID làm khóa chính. Dưới đây là cuộc di cư tạo:Khóa chính UUID trong mô hình Eloquent được lưu dưới dạng uuid nhưng trả về là 0

Schema::create('people', function (Blueprint $table) { 
    $table->uuid('id'); 
    $table->primary('id'); 
    ... 
    $table->timestamps(); 
} 

nào tạo ra schema MySQL sau:

CREATE TABLE `people` (
    `id` char(36) COLLATE utf8_unicode_ci NOT NULL, 
    ... 
    `created_at` timestamp NULL DEFAULT NULL, 
    `updated_at` timestamp NULL DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

Trong mô hình hùng biện của tôi, tôi có một phương pháp để tạo một thể hiện trong đó kêu gọi một phương pháp để tạo ra các UUID:

class Person extends Model 
{ 
    protected $fillable = [ 
     ... 
    ]; 

    public function make(array $personData){ 
     $person = new Person; 
     $person->setUUID(); 
     collect($personData)->each(function ($value, $columnName) use($person){ 
      if(in_array($columnName, $this->fillable)){ 
       $person->{$columnName} = $value; 
      } 
     }); 
     $person->save(); 
     return $person; 
    } 

    protected function setUUID(){ 
     $this->id = preg_replace('/\./', '', uniqid('bpm', true)); 
    } 

} 

Khi tôi tạo một phiên bản mẫu mới, nó lưu trữ nó trong cơ sở dữ liệu:

uuids stored

Nhưng khi tôi cố gắng để truy cập id dụ mới:

creating new instance and dumping id

Nó trả về là 0:

returned result

tôi thiếu gì ở đây?

Trả lời

8

Nevermind, tôi thấy câu trả lời sau khi tìm kiếm thông qua các tài liệu: https://laravel.com/docs/5.2/eloquent#eloquent-model-conventions

Dưới phần "Primary Keys" có một lời giới thiệu chút:

Bên cạnh đó, hùng hồn giả định rằng các khóa chính là một tăng giá trị số nguyên. Nếu bạn muốn sử dụng khóa chính không tăng, bạn phải đặt thuộc tính gia tăng $ trên mô hình của mình thành false.

Nếu bạn định sử dụng UUID, bạn phải đặt thuộc tính này thành false. Một khi tôi đã làm điều đó ở trên cùng của mô hình của tôi nó đã làm việc.

Vì tất cả các mô hình của tôi sẽ sử dụng UUID, tôi trích xuất logic UUID thành lớp cha. Dưới đây là hình thức:

class UuidModel extends Model 
{ 

    public $incrementing = false; 

    /** 
    * Sets the UUID value for the primary key field. 
    */ 
    protected function setUUID() 
    { 
     $this->id = preg_replace('/\./', '', uniqid('bpm', true)); 
    } 
} 
Các vấn đề liên quan