【发布时间】:2017-05-21 03:05:25
【问题描述】:
我正在使用 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 可能会自动将主整数键设置为自动递增。
此外,我尝试按照this 和this 回答的建议将列设置为unsigned 和index
如何阻止架构生成器将 relid 和 currency 字段设置为自动递增,因为它们只是外键?
【问题讨论】:
标签: php mysql laravel laravel-4