我使用Laravel 4.2架构构建器来创建一些彼此引用的表,并且遇到了一些问题。
我有一个简化的ERD。请注意,仅显示相关列:
请注意,我无法以任何方式修改tblcurrencies
和tbldomains
表,因为我正在开发一个模块以挂钩到现有系统。
我正在努力实现以下目标:
extensions
表包含有关tbldomains
表prices
表包含有关某种货币的域名的定价信息,以及其他类型值(注册,续订,转让)目前,我使用以下代码创建两个表:
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]:语法错误或访问冲突:1075表定义不正确;只能有一个自动列,必须将其定义为键
我也尝试将主键设置为唯一,确定Laravel可能会自动将主要整数键设置为自动增量。
的建议将列设置为unsigned
和index
如何停止架构构建器将relid
和currency
字段设置为自动递增,因为它们只是外键?
答案 0 :(得分:0)
基于以下链接上的Laravel文档Api,只有string()
方法可以具有length属性。
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)
你所做的是你为一个布尔变量($ autoIncrement)赋值(10),在这种情况下它总是返回true。有关此问题的进一步证明,请参阅php.net的以下链接。 php.net Boolean
之前我遇到过同样的问题,当我开始回顾Laravel文档时,90%的混淆将被清除。希望这会对你有所帮助。
注意:你也可以使用unsignedInteger()
方法,我认为它更明确,更容易记住:
unsignedInteger(string $column, bool $autoIncrement = false)
所以代码就是这样:
$table->unsignedInteger('relid');
$table->unsignedInteger('currency');