2016-09-08 6 views
0

Guter Tag,Laravel 5.2 Tropfen Fremdschlüssel

Ich versuche, einen Fremdschlüssel in einer Laravel 5.2 Migration wie dies umgesetzt zuvor fallen:

EDIT: Die Schaffung der ID in der Tabelle (vor der Verwendung Fremdschlüssel auf ihm) war:

$table->integer('agent_rights_id')->unsigned()->nullable(); 

Der Fremdschlüssel:

Schema::table('agents', function (Blueprint $table){ 
     $table->foreign('agent_rights_id')->references('id')->on('agent_rights'); 
    }); 

Mein dr op sieht wie folgt aus:

Schema::table('agents', function (Blueprint $table){ 
     $table->dropForeign('agents_agent_rights_id_foreign'); 
     $table->dropColumn('agent_rights_id'); 
    }); 

Ich fand heraus, dass man den „echten“ Indexnamen und nicht das Etikett nehmen müssen - das habe ich schon von im vorherigen Schnipsel gedacht haben (als Hinweis auf this question).

Aber das gibt mir die Fehler:

[Illuminate\Database\QueryException]                                               
SQLSTATE[HY000]: General error: 1025 Error on rename of './{name}/agents' to './{name}/#sql2-2a6-1d8' (errno: 152) (SQL: alter table `agents` drop foreign key `agents_agent_rights_id_foreign`) 



[PDOException]                                 
SQLSTATE[HY000]: General error: 1025 Error on rename of './{name}/agents' to './{name}/#sql2-2a6-1d8' (errno: 152) 

Researching diese keine wirklichen Lösungen bringt, nur Fehler Nachrichten von MySQL ...

Frage: Haben euch etwas darüber oder Was war falsch an meinem Schnipsel?

+0

Ich tat, was in dieser Frage gesagt, bevor ich diesen Beitrag erstellt. Das ist nicht die gleiche Frage, denn ich habe bereits getan, was dort gesagt wird. – Mentenyia

+0

Sie vermissen etwas, weil ich dasselbe in meinem Projekt ausgeführt habe und es funktioniert gut. Jedenfalls entferne ich das Duplikat und öffne es erneut. Ich überprüfe dein Skript erneut. Siehe die Laravel-Dokumentation https://laravel.com/docs/5.2/migrations. – Manish

+0

Sie können auch einen Array-Wert übergeben, der automatisch den konventionellen Constraint-Namen verwendet, wenn er wie '$ table-> dropForeign ([' agent_rights_id ']) ablegt; ' – Manish

Antwort

2

@Mentenyia Dies ist obligatorisch für die Verwendung von unsigned() vor dem Erstellen von Fremdschlüssel-Constraint. Bitte lesen Sie den Link https://laravel3.veliovgroup.com/docs/database/schema#foreign-keys.

Hinweis: Das im Fremdschlüssel referenzierte Feld ist sehr wahrscheinlich ein automatisches Inkrement und daher automatisch eine vorzeichenlose Ganzzahl. Bitte machen Sie sicher, das Fremdschlüsselfeld mit unsigned() zu erstellen, da beide Felder exakt denselben Typ haben müssen, muss die Engine in beiden Tabellen auf InnoDB gesetzt sein, und die referenzierte Tabelle muss vor der Tabelle erstellt werden mit dem Fremdschlüssel.

Sie sollten also so schaffen haben:

$table->integer('agent_rights_id')->unsigned(); // Always create column before creating Foreign key constraint otherwise this will also give error. 
$table->foreign('agent_rights_id')->references('id')->on('agent_rights'); 

Nach, wenn Sie Fremdschlüssel Kein Problem/Fehler entstehen löschen gehen werden.

Für Droping Indexierung Verwenden Sie diese Methode Tisch name_column-name_index-Typ

$table->dropForeign('agents_agent_rights_id_foreign'); 
+0

Ich habe immer noch den Fehler, wenn ich dies tue, auch wenn ich keine Nullable() nach unsigned() benutze ... Aber ich werde die gesamte Datenbank von Grund auf neu einrichten, um es zu testen. Ich werde dann antworten :) – Mentenyia

+0

Es war die Nullable() nach unsigned(), die den Ärger machte. Danke für Ihre Hilfe :) – Mentenyia