2016-04-13 19 views
8

Tôi đã schema sau để tạo các địa chỉ bảng:Laravel 5.2 chương trình cơ sở dữ liệu tạo ra một cột độc đáo bởi nó tự

Schema::create('addresses', function (Blueprint $table) { 
    $table->string('id')->index(); 
    $table->string('street', 100); 
    $table->integer('number', 5); 
    $table->string('addition', 10); 
    $table->string('postal_code', 7); 
    $table->string('place', 45); 
    $table->string('country', 45); 
    $table->timestamps(); 
    $table->softDeletes(); 
}); 

Vì lý do an ninh, 'id' là một chuỗi ngẫu nhiên được tạo ra và duy nhất thay vì một số nguyên tăng tự động.

Chỉ một vấn đề: Laravel làm cho cột 'số' duy nhất, bởi vì nó là cột duy nhất có số nguyên kiểu dữ liệu. Chúng tôi muốn cột 'id' là khóa chính và duy nhất.

Chúng tôi cũng đã cố gắng này:

$table->primary('id')->index(); 
$table->uuid('id')->index(); 
$table->string('id')->primary()->index(); 

tôi vẫn nhận được lỗi này:

Integrity constraint violation: 19 UNIQUE constraint failed:
addresses.number

+0

tôi sẽ bình luận về cái gì khác ở đây - bạn đang sử dụng một gen ngẫu nhiên xâu chuỗi duy nhất thay vì auto_increment vì lý do bảo mật - lý do gì? Nếu bạn không muốn hiển thị ID số, ​​tại sao bạn không cung cấp mã số được mã hóa hoặc mã hóa nó, base64_encode và phân phối ID đó? Bạn sẽ có một thời gian rất, rất xấu và bạn sẽ tìm hiểu lý do tại sao khi dữ liệu của bạn phát triển. – Mjh

Trả lời

3

này đã làm việc cho tôi:

Schema::create('addresses', function (Blueprint $table) { 
     $table->uuid('id')->primary(); 
     $table->integer('number', false); 
    }); 
+0

Điều này làm việc gần như, tôi vẫn có một lỗi vì Laravel đã tạo hai khóa chính: id và number. Vì vậy, tôi đã thay đổi $ table-> integer ('number', 5) thành $ table-> integer ('number', false); Tham số thứ hai bị vô hiệu hóa 'tăng tự động'. – Marten

+0

Thú vị ... Tôi đã chỉnh sửa câu trả lời cho phù hợp với .. Mặc dù tôi phải nói rằng tôi đã kiểm tra và Laravel đã không tạo khóa chính cho cột số cho tôi vì một số lý do – PeterTheLobster

0

Tôi có vấn đề này chính xác. Hãy xem bài viết này: http://garrettstjohn.com/article/using-uuids-laravel-eloquent-orm/

Khá nhiều điều đang xảy ra là Laravel "nói" họ hỗ trợ UUID nhưng thực sự họ cần một bàn tay giúp đỡ.

schema của bạn sẽ làm việc, nhưng chỉ để chắc chắn, tôi sử dụng nó như thế này:

$table->primary('id'); 

Sau khi sử dụng ví dụ cung cấp của bài viết, bạn nên có một cái gì đó tương tự như sau (đây là mô hình tài khoản của tôi):

<?php 

namespace App; 

use Illuminate\Foundation\Auth\User as Authenticatable; 
use Illuminate\Database\Eloquent\SoftDeletes; 

class User extends Authenticatable 
{ 

    // UuidForKey is a custom trait added in the app folder 
    use SoftDeletes, UuidForKey; 

    // This disabled the auto-incrementing 
    public $incrementing = false; 

    // Make sure id is set as primary 
    protected $primaryKey = "id"; 

    // Makes sure that the id is a string and not an integer 
    protected $casts = [ 
     'id' => 'string', 
    ]; 

    /** 
    * The attributes that are mass assignable. 
    * 
    * @var array 
    */ 
    protected $fillable = [ 
     'firstname', 
     'lastname', 
     'email', 
     'password', 
     'role', 
     'active', 
    ]; 

    /** 
    * The attributes excluded from the model's JSON form. 
    * 
    * @var array 
    */ 
    protected $hidden = [ 
     'password', 'remember_token', 
    ]; 
} 
Các vấn đề liên quan