Laravel Migration添加外键不起作用

时间:2017-12-01 09:27:03

标签: php laravel migration

我回来向某些表添加外键但这个表不起作用。

Schema::table('users', function(Blueprint $table){
    $table->integer('account_type')->unsigned()->change();
    $table->foreign('account_type')
        ->references('id')
        ->on('account_types');
});

它会在终端中抛出这3个错误:

[Illuminate\Database\QueryException] SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint (SQL: alter table `users` add constraint `users_account_type_foreign` foreign key (`account_type`) references `account_types` (`id`))


[Doctrine\DBAL\Driver\PDOException]SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint


[PDOException] SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint

知道我需要做些什么才能解决这个问题?我无法点击users表中的account_type字段,并在使用SequelPro时被带到account_types表中的相关帐户类型。

3 个答案:

答案 0 :(得分:0)

您的表'account_type'需要在'users'表之前创建。

基本上在Laravel上,用户表是第一个创建的,要解决它,您可以将所有架构放在一个迁移文件中。或者您需要更改用户文件名称中的日期,因为laravel按名称顺序执行迁移。

我按照以下方式进行迁移:

<?php

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

class DatabaseContent extends Migration
{

/**
 * Run the migrations.
 *
 * @return void
 */
public function up()
{
    $connection = config('database.default');

    Schema::connection($connection)->create('account_type', function 
    (Blueprint $table) {
   // Own Method
  }
    Schema::connection($connection)->create('users', function 
(Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->timestamps();
    });

答案 1 :(得分:0)

我建议你专门创建一个迁移来添加外键约束。应该以这样的方式创建迁移,即对数据库的每次更改都是新迁移。这样,如果出现问题,你可以回滚。正如你所说的那样,“返回添加”可能是问题的根源。与某些用户建议的一样,创建迁移的顺序对于数据库的构建方式至关重要。并且您必须创建两个参与表,以便在它们上创建外键。

答案 2 :(得分:0)

如果我们假设您已经创建了account_typesusers,那么您可以这样做。

运行此命令以创建新的迁移。

php artisan make:migration add_account_type_to_users

然后将此添加到您的up函数中,这样做将更新已存在的users表,添加列account_type,然后将外键添加到account_types

public function up()
{
    Schema::table('users', function(Blueprint $table) {
        $table->integer('account_type')->unsigned();
        $table->foreign('account_type')->references('id')->on('account_types');
    });
}

然后将此添加到您的向下功能,以允许迁移顺利运行,以便将来进行更改和/或刷新。

public function down()
{
    Schema::table('users', function(Blueprint $table) {
        $table->dropColumn('account_type');
    });
}

我假设您的问题与迁移文件的约会有关 - 我建议您仔细检查它们并确保它们以正确的顺序执行。