2017-01-06 7 views
2

Я использую построитель схем Laravel 4.2 для создания некоторых таблиц, ссылающихся друг на друга, и у меня есть некоторые проблемы.Первичный ключ строителя схемы Laravel как внешний ключ

У меня есть упрощенная ERD. Обратите внимание, что только соответствующие столбцы показаны:

ERD

Обратите внимание, что я не могу изменять tblcurrencies и tbldomains таблицы в любом случае, так как я занимаюсь разработкой модуля для подключения к существующей системе.

Я пытаюсь добиться следующего:

  1. Таблица extensions содержит дополнительную информацию о строках в tbldomains таблице
  2. Таблица prices содержит информацию о ценах о домене в определенной валюте, с дополнительным (регистрация, обновление, передача)
  3. Я хочу использовать внешние ключи, чтобы я мог выполнять каскадные удаления.

В настоящее время я использую следующий код, чтобы создать две таблицы:

Capsule::schema()->create('extensions', function ($table) { 
    $table->engine = 'InnoDB'; 
    $table->integer('relid', 10); 
    // ... 
    $table->primary(['relid']); 
    $table->foreign('relid')->references('id')->on('tbldomains')->onDelete('cascade'); 
}); 

Capsule::schema()->create('prices', function ($table) { 
    $table->engine = 'InnoDB'; 
    $table->integer('relid', 10); 
    $table->integer('currency', 10); 
    $table->enum('type', ['domainregister', 'domainrenew', 'domaintransfer']); 
    // ... 
    $table->primary(['relid', 'currency', 'type']); 
    $table->foreign('relid')->references('relid')->on('extensions')->onDelete('cascade'); 
    $table->foreign('currency')->references('id')->on('tblcurrencies')->onDelete('cascade'); 
}); 

Сценарий создания результатов prices таблицы в следующем запросе SQL:

create table `prices` (`relid` int unsigned null auto_increment primary key, `currency` int unsigned null auto_increment primary key, `type` enum('domainregister', 'domainrenew', 'domaintransfer') not null, ...) engine = InnoDB 

Который в свою очередь, приводит к следующей ошибке:

SQLSTATE[42000]: Syntax error or access violation: 1075 Incorrect table definition; there can be only one auto column and it must be defined as a key

Я также попытался установить первичные ключи как уникальные, полагая, что, возможно, Laravel автоматически устанавливает первичные целые ключи как автоматическое приращение.

Кроме того, я попытался установить колонки в unsigned и index, как это было предложено this и this ответ

Как остановить строитель схемы с установкой relid и currency полей в авто инкремент, так как они просто внешние ключи?

ответ

0

на основе Laravel Documentation Api по приведенной ниже ссылке, только string() способ может иметь длину атрибута. Laravel Documentation Api

Таким образом, чтобы сделать эти два столбца unsigned и не primary key или auto increment сделать следующие изменения:

из этого:

$table->integer('relid', 10); 
$table->integer('currency', 10); 

к этому:

$table->integer('relid', false, true); 
$table->integer('currency', false, true); 

Потому что поскольку в документации синтаксис integer() метод:

integer(string $column, bool $autoIncrement = false, bool $unsigned = false) 

А что вы сделали, вы назначили значение (10), к булевой переменной ($ Autoincrement), который будет всегда возвращает значение ИСТИНА в данном случае. Для дальнейшего доказательства этого, пожалуйста, обратитесь к приведенной ниже ссылке с php.net. php.net Boolean

У меня была такая же проблема раньше, и когда я начну ссылаться на документацию Laravel, 90% путаницы будет очищено. Надеюсь, это поможет вам.


Примечание: Вы можете также использовать unsignedInteger() метод, который я думаю, что это более четко и легче запомнить:

unsignedInteger(string $column, bool $autoIncrement = false) 

Таким образом, код будет выглядеть примерно так:

$table->unsignedInteger('relid'); 
$table->unsignedInteger('currency');