2016-04-13 11 views
8

Ich habe das folgende Schema die Adressen-Tabelle für die Erstellung von:Laravel 5.2 Datenbankschema erstellt eine eindeutige Spalte, indem sie es selbst

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(); 
}); 

Aus Sicherheitsgründen ‚id‘ ist eine zufällig generierte und eindeutige Zeichenfolge anstelle einer Autoinkrement-Ganzzahl

Nur ein Problem: Laravel macht die Spalte 'Nummer' einzigartig, weil es die einzige Spalte mit Datentyp Integer ist. Wir wollen die Spalte 'id' als primären und eindeutigen Schlüssel.

Wir haben auch versucht dies:

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

ich diesen Fehler noch bin immer:

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

+0

ich über etwas anderes hier kommentieren werde - Sie verwenden eine zufällige gen Erratete eindeutige Zeichenfolge anstelle von auto_increment aus Sicherheitsgründen - welche Gründe sind das? Wenn Sie die numerische ID nicht preisgeben möchten, warum liefern Sie keine verschlüsselte Nachricht oder verschlüsseln sie, base64_encode und liefern Sie diese? Sie werden eine sehr, sehr schlechte Zeit haben und Sie werden erfahren, warum Ihre Daten wachsen. – Mjh

Antwort

3

Dieser arbeitete für mich:

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

Das hat fast funktioniert, ich hatte immer noch einen Fehler, weil Laravel zwei Primärschlüssel erstellt hat: ID und Nummer. Also habe ich $ table-> integer ('number', 5) in $ table-> integer ('number', false) geändert; Der zweite Parameter deaktiviert 'Autoinkrement'. – Marten

+0

Interessant ... Ich habe meine Antwort so bearbeitet, dass sie zu deiner passt. Obwohl ich sagen muss, dass ich überprüft habe und Laravel aus irgendeinem Grund die Zahlenspalte nicht für mich gemacht hat – PeterTheLobster

0

ich genau dieses Problem hatte. Sehen Sie sich diesen Artikel an: http://garrettstjohn.com/article/using-uuids-laravel-eloquent-orm/

So ziemlich, was passiert ist, dass Laravel "sagt", dass sie UUIDs unterstützen, aber sie brauchen wirklich eine helfende Hand.

Ihr Schema funktioniert, aber nur um sicher zu sein, ich benutze es als dies:

$table->primary('id'); 

Nachdem der Artikel zur Verfügung gestellten Beispielen verwenden, sollten Sie etwas Ähnliches wie diese haben (das ist mein User-Modell):

<?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', 
    ]; 
}