当前位置: 首页 > 知识库问答 >
问题:

Laravel模式生成器主键为外键

步浩壤
2023-03-14

我正在使用Laravel4.2SchemaBuilder创建一些相互引用的表,但遇到了一些问题。

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

请注意,我无法以任何方式修改tblcurrencestbldomains表,因为我正在开发一个模块以连接到现有系统。

我正在努力实现以下目标:

  1. extensions表包含有关tbldomains表中的行的额外信息

目前,我使用以下代码创建两个表:

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

此外,我还尝试将列设置为无符号索引,正如本文和本文答案所建议的那样

如何阻止架构生成器将relidcurrency字段设置为自动递增,因为它们只是外键?

共有1个答案

冀弘济
2023-03-14

基于下面链接上的Laravel文档Api,只有string()方法可以具有长度属性。Laravel文档Api

因此,要使这两列无符号和非主键自动递增进行以下更改:

由此:

$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的以下链接。net布尔值

我以前也遇到过同样的问题,当我开始引用Laravel文档时,90%的混乱将被清除。希望这对你有帮助。

注意:您也可以使用unsignedintger()方法,我认为它更显式,更容易记住:

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

因此,代码如下所示:

$table->unsignedInteger('relid');
$table->unsignedInteger('currency');
 类似资料:
  • 我在model和model之间有一个关系。这意味着每个用户都有0或1个总统设置。因此,表的主索引与外键相同。 这就是我想要添加外键的方式: 但是我得到以下错误: 我怎么才能修好它?我使用InnoDB引擎,所以我知道我可以设置索引键为外键。

  • 问题 你需要准备一个复杂的、多部分的对象,你希望操作不止一次或有不同的配置。 解决方案 创建一个生成器封装对象的产生过程。 Todo.txt 格式提供了一个先进的但还是纯文本的方法来维护待办事项列表。手工输入每个项目有损耗且容易出错,然而 TodoTxtBuilder 类可以解决我们的麻烦: class TodoTxtBuilder constructor: (defaultParamet

  • 亦称: 建造者模式、Builder 意图 生成器模式是一种创建型设计模式, 使你能够分步骤创建复杂对象。 该模式允许你使用相同的创建代码生成不同类型和形式的对象。 问题 假设有这样一个复杂对象, 在对其进行构造时需要对诸多成员变量和嵌套对象进行繁复的初始化工作。 这些初始化代码通常深藏于一个包含众多参数且让人基本看不懂的构造函数中; 甚至还有更糟糕的情况, 那就是这些代码散落在客户端代码的多个位置

  • 所以我忙于做这个迁移,经过大量的研究,他仍然给我以下错误消息: SQLSTATE[HY000]:常规错误: 1005无法创建表.(errno: 150"外键约束格式不正确")(SQL:更改表添加约束外键()引用()在更新级联上删除级联 代码: 版本: 如我所知,这应该正确地形成外键。任何帮助都将被感激!

  • 这听起来很无聊,但我想知道我是否可以让主键在Laravel中作为外键工作,我对Laravel是新手。 因此,我有两个迁移“User”和“Student”,如下所示:User: 学生: 所以,我所想要的是,学生(uniqueId)中的主键也可以用作引用User表中的uniqueId列的外键。 提前谢谢。

  • 问题内容: 我正在尝试在表上创建一个外键,该键必须指向表内的列。但是当我尝试以下操作时,它不起作用。将不会产生。它只是在表内添加列名。 我究竟做错了什么?如何在表内部使外键指向表? 问题答案: 我认为您需要: 我把我的自动迁移声明放在这样 让我知道是否有帮助。