Laravel 迁移无法添加外键

Posted

技术标签:

【中文标题】Laravel 迁移无法添加外键【英文标题】:Laravel migration can't add foreign key 【发布时间】:2016-02-11 13:09:56 【问题描述】:

我正在尝试编写一个 laravel 数据库迁移,但我收到以下关于外键的错误:

  [Illuminate\Database\QueryException]                                                                                                                                                                                                                    
  SQLSTATE[42000]: Syntax error or access violation: 1072 Key column 'category_id' doesn't exist in table (SQL: alter table `subcategories` add constraint subcategories_category_id_foreign foreign key (`category_id`) references `categories` (`id`))  



  [PDOException]                                                                                           
  SQLSTATE[42000]: Syntax error or access violation: 1072 Key column 'category_id' doesn't exist in table 

确实会创建 categoriessubcategories 表,但不会创建外键。这是我的迁移:

<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateCategoryTable extends Migration

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    
        Schema::create('categories', function ($table) 
            $table->increments('id')->unsigned();
            $table->string('name')->unique();
        );

        Schema::create('subcategories', function ($table) 
            $table->increments('id')->unsigned();
            $table->foreign('category_id')->references('id')->on('categories');
            $table->string('name')->unique();
        );
    

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    
        Schema::drop('categories');
        Schema::drop('subcategories');
    

有什么想法吗?谢谢!

【问题讨论】:

你不需要自动递增字段作为无符号的外键引用。 【参考方案1】:

Laravel 7、8

正如 Limon Monte 提到的,首先创建列然后添加外键约束

$table->foreignId('category_id');
$table->foreign('category_id')->references('id')->on('categories'); 
        

【讨论】:

太棒了。真的很棒!【参考方案2】:

整数对我不起作用。相反,我使用 bigInteger 创建外键:

$table->bigInteger('category_id')->unsigned()->index()->nullable();
$table->foreign('category_id')->references('id')->on('categories')->onDelete('cascade');

【讨论】:

【参考方案3】:

我忘记在我调用的方法中添加-&gt;get()

【讨论】:

【参考方案4】:

您应该在创建外键之前创建列:

$table->integer('category_id')->unsigned();
$table->foreign('category_id')->references('id')->on('categories');

文档:http://laravel.com/docs/5.1/migrations#foreign-key-constraints

【讨论】:

以上是关于Laravel 迁移无法添加外键的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 表迁移:无法添加外键约束

迁移问题:无法在laravel中添加外键约束

Laravel 5.3 迁移:1215 无法添加外键约束

无法添加外键约束 - Laravel 迁移错误

Laravel 5.2 迁移:无法添加 char 数据类型的外键

Laravel 迁移 - 一般错误:1215 无法添加外键约束