2017-01-06 25 views
2

我正在使用Laravel 4.2架构生成器来创建一些引用对方的表,并且遇到一些问题。Laravel架构生成器主键作为外键

我有一个简化的ERD。请注意,只有相关列显示:

ERD

请注意,我不能以任何方式修改的tblcurrenciestbldomains表,因为我开发一个模块挂接到现有系统中。

我努力实现以下目标:

  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自动将主整数键设置为自动增量。

此外,我尝试设置列作为unsignedindex,通过thisthis答案建议

如何停止的模式构建器设置relidcurrency字段自动递增,因为它们仅仅是外键?

回答

0

基于Laravel Documentation Api的下面的链接,只有string()方法可以有length属性。 Laravel Documentation Api

因此,为了使这两个柱unsigned,而不是primary keyauto 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)布尔变量($自动增量),这将始终在这种情况下返回true。为了进一步证明这一点,请参阅php.net下面的链接。 php.net Boolean

我之前有过同样的问题,当我开始回顾Laravel文档时,90%的混淆将被清除。希望这可以帮助你。


注意:您还可以使用unsignedInteger()方法,我认为它更明确,更容易记住:

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

因此,代码会像这样:

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