将外键添加到用户表时 Laravel 7 错误

Posted

技术标签:

【中文标题】将外键添加到用户表时 Laravel 7 错误【英文标题】:Laravel 7 error when adding foreign key to Users table 【发布时间】:2020-10-24 14:01:37 【问题描述】:

使用 Laravel 7 和 mysql,我正在尝试将外键添加到 Laravel Auth 系统生成的用户表中...

首先,我创建了新表 user_type,然后在另一次迁移中,我尝试将外键添加到 users 表中,但随后出现错误。

这里是迁移和错误的要点:https://gist.github.com/jdalri/73cee7a00c513c93afd5186ca27d74a4

我也试过

$table->unsignedBigInteger('user_type_id');

$table->foreign('user_type_id')->references('id')->on('user_type');

但遇到了同样的错误。

谢谢

【问题讨论】:

我看到了你的代码,在这里你想建立一个从useruser_type的关系表。但是当您的系统在useruser_type 表上建立关系时。当时user_type 表不存在。所以你得到这个错误。为此,您需要先创建user_type 表,然后您可以从user 表建立关系。希望你能理解。 【参考方案1】:

您的语法是正确的,但您缺少的是外键没有默认值(存在于 user_type 表中)或其不可为空。因为 user_type 表中没有记录为空值,所以如果您使用php artisan migrate:fresh 重置数据库,这将起作用或使该列可为空。

【讨论】:

我已经在用户表上有一个用户,所以 php artisan migrate:fresh 命令解决了这个问题。谢谢【参考方案2】:
$table->unsignedBigInteger('user_type_id')->nullable();

$table->foreign('user_type_id')->references('id')->on('user_type');

这很有效,因为从字面上看,错误是在向用户表添加内容之前,user_type_id 必须有内容。如果您将其设为空,它会起作用,但这样做不是一个好主意。我建议你如果 user_types 不多,将它们创建为 enum 并选择默认的。

【讨论】:

【参考方案3】:

AddUserTypeToUsersTable 没有主键

试试这个

    Schema::table('users', function (Blueprint $table) 
        $table->increments('id');
        $table->unsignedInteger('user_type_id');
        $table->foreign('user_type_id')->references('id')->on('user_type');
    );

【讨论】:

这个迁移不是用来创建用户表的,它已经被创建了看看迁移名称这个迁移只是把这个列添加到现有的用户表中【参考方案4】:

这里是 Laravel 文档的链接:https://laravel.com/docs/7.x/migrations#foreign-key-constraints

Schema::table('users', function (Blueprint $table) 
    $table->foreignId('user_type_id')->constrained('user_type');
);

【讨论】:

以上是关于将外键添加到用户表时 Laravel 7 错误的主要内容,如果未能解决你的问题,请参考以下文章

无法将外键约束添加到数据透视表

Laravel:无法添加外键约束

为啥将外键字段添加到模型后 URL 不起作用?

Laravel - 如何将外键用于具有识别外键的表?

Laravel 迁移不能在用户表中添加外键

如何将外键添加到现有表?