【发布时间】:2021-12-14 03:23:14
【问题描述】:
Laravel 8
由于某种原因,我的暂存环境不允许我运行迁移。
我收到以下错误。
General error: 1215 Cannot add foreign key constraint (
SQL: create table `login_credentials` (
`id` char(36) not null,
`username` varchar(75) not null,
`confirmation_code` varchar(36) null,
`deleted_at` timestamp null,
`remember_token` varchar(100) null,
`created_at` timestamp null,
`updated_at` timestamp null)
default character set utf8mb4
collate 'utf8mb4_unicode_ci'
engine = InnoDB)
我还没有定义任何外键,这似乎是最近才开始的。我为我的应用程序编写了单元测试,所以我的大部分开发都是在本地完成的。
在我推送到生产之前,我很少会上传到登台服务器以进一步测试更详细的内容。如果它是一个小的可协商更改,那么一旦单元测试通过并验证干净的构建,它将从本地转到生产。所以不幸的是,从现在到几周前,这成为了一个问题。
我的 login_credentials 迁移文件。
class CreateLoginCredentialsTable extends Migration
{
public function up(): void
{
Schema::create('login_credentials', function (Blueprint $table) {
$table->uuid('id')->nullable(false)->unique()->primary();
$table->string('username',75)->unique();
$table->string('confirmation_code',36)->nullable()->unique();
$table->softDeletes();
$table->rememberToken();
$table->timestamps();
});
}
}
我在 Stackoverflow 上搜索了高低,并尝试了以下方法。
- 验证我的用户
id列在任何地方都作为 uuid 匹配。 - 验证数据库是 InnoDB
- 验证没有在任何迁移中定义外键
- 验证迁移文件的执行顺序是否正确
- 将作曲家更新为最新的依赖项/版本。
- 运行所有 artisan 命令以清除缓存、会话、路由、视图等。
- 当 tbl 的 id 是 uuid 时,验证我的模型是 $incrementing = false。
- 将 laravel 迁移文件移动到我的迁移文件夹中,并将
Cashier::ignoreMigrations(); Passport::ignoreMigrations();添加到我的 appserviceprovider 并更新这些迁移文件以确保 user_id 不是 bigInt 或 Int,并定义为 uuid。 - 编写一个 trait 以确保 laravel 知道 id 是一个 uuid。
在我的本地主机中运行迁移文件运行良好,没有错误。
有什么想法吗?
【问题讨论】:
-
我创建了一个迁移文件并复制了您的架构并运行以从我这里调试它,但它运行时没有错误,i.stack.imgur.com/UIRrw.png,i.stack.imgur.com/A1NND.png,所以现在的问题是,您是什么数据库使用,以及您是如何进行迁移的
-
运行
composer dump-autoload并重试
标签: mysql laravel database foreign-keys