2016-04-13 3 views
8

Я следующая схема для создания адреса таблицы:Laravel 5.2 Схема базы данных создает уникальный столбец, это сам

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

По соображениям безопасности, «идентификатор» является случайной сгенерирована и уникальной строкой вместо auto increment integer.

Только одна проблема: Laravel делает номер столбца уникальным, потому что это единственный столбец с типом данных integer. Мы хотим, чтобы столбец «id» был основным и уникальным ключом.

Мы также попытался это:

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

Я все еще получаю эту ошибку:

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

+0

я собираюсь комментировать о чем-то еще здесь - вы используете случайный ген стирая уникальную строку вместо auto_increment из соображений безопасности - какие причины? Если вы не хотите раскрывать числовой идентификатор, почему бы вам не поставить закодированный или зашифровать его, base64_encode и доставить это? В противном случае у вас будет очень и очень плохое время, и вы узнаете, почему, когда ваши данные растут. – Mjh

ответ

3

Это работает для меня:

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

Это работало почти, у меня все еще была ошибка, потому что Laravel создал два первичных ключа: id и number. Поэтому я изменил $ table-> integer ('number', 5) на $ table-> integer ('number', false); Второй параметр отключил «auto increment». – Marten

+0

Интересно ... Я отредактировал свой ответ, чтобы соответствовать вашему. Хотя я должен сказать, что я проверил, и Laravel по какой-то причине не сделал первичный ключ номера столбца для меня – PeterTheLobster

0

Я имел эту точно проблему. Посмотрите эту статью: http://garrettstjohn.com/article/using-uuids-laravel-eloquent-orm/

Довольно многое происходит в том, что Laravel «говорит», что они поддерживают UUID, но им действительно нужна помощь.

Ваша схема будет работать, но только, чтобы быть уверенным, я использую его, как это:

$table->primary('id'); 

После использования привел примеры статьи, вы должны иметь что-то похожее на это (это моя модель пользователя):

<?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', 
    ]; 
} 
Смежные вопросы