2016-03-20 4 views
8

Ich hielt diese während php artisan migrateTropfen Eindeutiger Index Laravel 5

SQLSTATE [42000] laufen bekommen: Syntaxfehler oder Zugriffsverletzung: 1091 Kann nicht DROP 'E-Mail'; Überprüfen Sie, ob die Spalte/der Schlüssel existiert

Während ich sehe, dass E-Mail in meiner Datenbank existiert.

enter image description here


Mein Migrationsskript. Ich habe versucht, die einzigartige Einschränkung fallen zu lassen.

<?php 

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

class AlterGuestsTable3 extends Migration { 

    /** 
    * Run the migrations. 
    * 
    * @return void 
    */ 
    public function up() 
    { 
     Schema::table('guests', function(Blueprint $table) 
     { 
      $table->dropUnique('email'); 

     }); 

    } 

    /** 
    * Reverse the migrations. 
    * 
    * @return void 
    */ 
    public function down() 
    { 
     Schema::table('guests', function(Blueprint $table) 
     { 

      $table->dropUnique('email'); 

     }); 
    } 

} 

Habe ich vergessen, irgendwelche Caches zu löschen?

Irgendwelche Hinweise für mich?

+0

Versuchen Sie, den eindeutigen Index oder die E-Mail-Spalte vollständig zu löschen?Auch, nur ein Heads-up, Ihre Down-Funktion versucht auch, den Index fallen zu lassen, anstatt es neu zu erstellen. – stratedge

+0

Ich möchte nur den eindeutigen Index löschen. – ihue

Antwort

20

Beim Löschen von Indizes erwartet Laravel, dass der vollständige Name des Index angegeben wird.

Sie können Ihre Datenbank nach dem vollständigen Namen des Indexes durchsuchen. Wenn der Schlüssel jedoch durch eine vorherige Laravel-Migration generiert wurde, sollte der Name einer einfachen Namenskonvention entsprechen.

Hier ist, was die documentation über seine Namenskonvention zu sagen hat (Stand: v5.2):

standardmäßig Laravel vergibt automatisch einen angemessenen Namen zu den Indizes. Verknüpfen Sie einfach den Tabellennamen, den Namen der indizierten Spalte und den Indextyp.

Meine Vermutung ist, deshalb erhalten Sie einen Fehler. Es gibt keinen email Index, aber wahrscheinlich gibt es einen guests_email_unique Index.

dieser Migration Geben Sie einen Schuss:

<?php 

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

class AlterGuestsTable3 extends Migration { 

    /** 
    * Run the migrations. 
    * 
    * @return void 
    */ 
    public function up() 
    { 
     Schema::table('guests', function(Blueprint $table) 
     { 
      $table->dropUnique('guests_email_unique'); 

     }); 

    } 

    /** 
    * Reverse the migrations. 
    * 
    * @return void 
    */ 
    public function down() 
    { 
     Schema::table('guests', function(Blueprint $table) 
     { 
      //Put the index back when the migration is rolled back 
      $table->unique('email'); 

     }); 
    } 

} 

Ich verstehe es ein wenig verwirrend ist, dass bei der Erstellung eines Index Sie die Spaltennamen angeben, aber wenn Sie den Index später fallen müssen Sie den Index der vollständigen Namen liefern.

Bitte beachten Sie, dass ich auch die down() Methode angepasst habe, so dass es den eindeutigen Index durch Hinzufügung zurückfallen lässt.

+0

Du hast mein Leben gerettet Kumpel :) – ihue

+0

Happy to Service! – stratedge

7

von official documentation können Sie sehen folgendes:

Wenn Sie ein Array von Spalten in eine Methode übergeben, werden Indizes, die herkömmlichen Indexnamen Tropfen erzeugt auf den Tabellennamen basieren, Spalten und Schlüsseltyp :

Schema::table('geo', function ($table) { 
    $table->dropIndex(['state']); // Drops index 'geo_state_index' 
}); 



können Sie es fallen nur einfach mit [] um Feldname:

Schema::table('guests', function(Blueprint $table) 
{ 
    $table->dropUnique(['email']); 
}); 
+1

Das ist die bessere Antwort meiner Meinung nach, da es Laravel ermöglicht, den Schlüsselnamen zu bestimmen, indem er den Prozess benutzt, um es zu erstellen. – Fireynis

+0

@Fireynis danke für Ihre Meinung (; – num8er