在 Laravel 8 中获取“错误地通知外键约束”

Posted

技术标签:

【中文标题】在 Laravel 8 中获取“错误地通知外键约束”【英文标题】:Getting "Foreign key constraint is incorrectly informed" in Laravel 8 【发布时间】:2021-05-22 14:23:04 【问题描述】:

我正在尝试使用 foreignId 从另一个表中获取 ID,但它不会让我这样做。

我的用户表:

public function up()
    
        Schema::create('users', function (Blueprint $table) 
            $table->id('user_id');
            $table->string('first_name', 40);
            $table->string('last_name', 40);
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->foreignId('tier_id')->references('tier_id')->on('tiers');
            $table->rememberToken();
            $table->timestamps();
        );
    

我的层表:

public function up()
    
        Schema::create('tiers', function (Blueprint $table) 
            $table->id('tier_id');
            $table->string('name');
            $table->float('price');
            $table->string('max_resolution');
            $table->integer('max_users');
            $table->timestamps();
        );
    

我做错了什么,请帮忙!

已解决,方法如下: Espresso 的评论似乎有帮助,迁移完美完成,我需要做的就是更改文件名。谢谢!

【问题讨论】:

只要把你的tires迁移文件的名字改成2014_10_11_000000_create_tiers_table.php,问题就解决了 Espresso 的评论有帮助,我尝试了其他人,但他们没有用。谢谢! 哦,抱歉,我是 SOF 的新手,谢谢! 【参考方案1】:

原因:您收到此错误,因为您的 users 迁移在 tires 迁移之前运行,并且当时外键 tier_id 无法从父表 @987654324 获得@

修复:只需更改您的tires 迁移文件的名称2014_10_11_000000_create_tiers_table.php,这将解决您的问题。因为现在tires 将在users 表之前运行

【讨论】:

【参考方案2】:

你能像这样尝试你的迁移吗 父表。

public function up()
    
        Schema::create('tiers', function (Blueprint $table) 
            $table->increments('tier_id');
            $table->string('name');
            $table->float('price');
            $table->string('max_resolution');
            $table->integer('max_users');
            $table->timestamps();
        );
    

子表

public function up()
    
        Schema::create('users', function (Blueprint $table) 
            $table->increments('users_id');
            $table->string('first_name', 40);
            $table->string('last_name', 40);
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->integer('tier_id')->unsigned()->nullable();
            $table->rememberToken();
            $table->timestamps();

            
            $table->foreign('tier_id')->references('tier_id')->on('tiers');
        );
    

【讨论】:

【参考方案3】:

当列类型不匹配时,通常会产生此错误。

您的迁移看起来没有错。假设您在迁移过程中遇到错误,并且您的 tiers 迁移在 users 迁移之前,请尝试一下。

$table->foreignId('tier_id')->constrained('tiers', 'tier_id');

https://laravel.com/docs/8.x/migrations#column-method-foreignId

如果用户迁移文件出现在层级迁移之前,则不要在users 迁移文件中创建外键,而是在tiers 迁移文件之后添加另一个迁移以添加外键约束。像这样的:

您的users 迁移文件:

 ...
  $table->foreignId('tier_id');
 ...

新的迁移文件add_tier_id_foreign_key_to_users_table

 //up
 Schema::table('users', function (Blueprint $table) 
    $table->foreign('tier_id')->references('tier_id')->on('tiers');
 );

 //down
 Schema::table('users', function (Blueprint $table) 
    $table->dropForeign('users_tier_id_foreign');
 );
 
 

【讨论】:

以上是关于在 Laravel 8 中获取“错误地通知外键约束”的主要内容,如果未能解决你的问题,请参考以下文章

如何在中间件 laravel 8 中获取最后一个参数

laravel 8:插入方法在 eloquent 中获取最后一个插入 id(插入方法)

我可以在 Facadesdb 插入中获取主键以供直接使用 - Laravel 8

laravel 8 没有从 ajax 请求中获取数据

如何在刀片 laravel 8 中获取选择输入的旧值?

输入详细信息表时,我无法从主表中获取 ID(Laravel 8)