2017-12-01 7 views
0

私はいくつかのテーブルに外部キーを追加していますが、これは機能しません。Laravel外部キーを追加するための移行は動作しません

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 

私はこの問題を解決するために何をする必要があるか任意のアイデア?私は自分のユーザーテーブルのaccount_typeフィールドをクリックして、SequelProを使用してaccount_typesテーブルの関連するアカウントタイプに移動することはできませんでした。

+0

'account_types'を作成した後に移行' users'が作成されていますか?そうであれば、 'account_types'マイグレーションの日付を' users'より上になるように変更することをお勧めします。 – Classified

+0

@Classifiedライブサーバー上にデータがあるので、すべての移行を再実行したくありません。その周りに他の方法はありませんか? – Lovelock

+0

'account_types'テーブルを' users'テーブルの前に作成し、 'users'を変更する新しい移行を作成して外部関係を追加することができます。 – Classified

答えて

0

テーブル 'account_type'は 'users'テーブルの前に作成する必要があります。

基本的にLaravelでは、ユーザーテーブルが最初に作成され、それを解決するためにすべてのスキーマを1つの移行ファイルに配置することができます。または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(); 
    }); 
+0

'users'テーブルが存在しないという結論にどうやって来ますか? –

+1

@Konafets彼は 'users'テーブルが存在しないと言っているわけではありません。後で作成されるテーブルに対して外部関係を作成できないと言っています(実際には、存在しない 'account_types'テーブル) – Classified

+0

私はしばしば同じ問題を抱えていて、それを解決するために –

0

私はあなたが外部キー制約を追加するために、具体的移行を作成することを示唆しています。移行は、データベースへの各変更が新しい移行であるように作成する必要があります。そうすれば、何かがうまくいかない場合は、ロールバックすることができます。あなたがしていたと言ったように「バック追加」は、おそらく問題の根源です。一部のユーザーが示唆しているように、移行の作成順序は、データベースの構築方法にとって重要です。また、外部キーのコンストレインを作成するには、両方のテーブルを作成しておく必要があります。

+0

私の言葉ははっきりしないかもしれません。ユーザー表が存在し、account_types表も存在します。これは独自の移行であり、現在実行されている最後の移行です。 – Lovelock

+1

ご清聴ありがとうございます。あなたの現在の 'users'テーブルの中のいくつかのデータがそのような制約が追加されるのを許さない場合があります。 'users.account_type'カラムのデータを確認しましたか? –

0

すでにaccount_typesusersを作成していることを前提とすると、これができます。

新しい移行を作成するには、このコマンドを実行します。

php artisan make:migration add_account_type_to_users 

次に、あなたのアップ機能にこれを追加し、これが何を行いますと、列account_typeを追加し、account_typesテーブルへの外部キーを追加することで、既存のusersテーブルを更新しています。

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'); 
    }); 
} 

私はあなたの問題は、移行ファイルのデートであると仮定しています - 私はそれらの上に行くと、彼らが正しい順序で実行され得ることを確認するためにあなたをアドバイスします。

関連する問題