2016-03-20 15 views
8

ho continuato a ottenere gestito questo mentre php artisan migrategoccia unico Indice laravel 5

SQLSTATE [42000]: Errore di sintassi o violazione di accesso: 1091 Impossibile eliminare 'email'; verifica che la colonna/chiave esista

Mentre vedo che l'e-mail è presente nel mio database.

enter image description here


mio script di migrazione. Stavo cercando di eliminare il vincolo univoco.

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

     }); 
    } 

} 

Ho dimenticato di cancellare eventuali cache?

Qualche suggerimento per me?

+0

Si sta tentando di eliminare l'indice univoco o la colonna di posta elettronica interamente?Inoltre, solo un heads-up, la funzione down tenta anche di rilasciare l'indice, invece di ricrearlo. – stratedge

+0

Voglio solo eliminare l'indice univoco. – ihue

risposta

20

Quando si rilasciano gli indici, Laravel si aspetta che venga fornito il nome completo dell'indice.

È possibile controllare il database per il nome completo dell'indice, ma se la chiave è stata generata da una precedente migrazione di Laravel, il suo nome deve essere conforme a una convenzione di denominazione singola e semplice.

Ecco ciò che il documentation ha da dire sulla sua convenzione di denominazione (come di v5.2):

Per impostazione predefinita, laravel assegna automaticamente un nome ragionevole agli indici. Basta concatenare il nome della tabella, il nome della colonna indicizzata e il tipo di indice.

La mia ipotesi è questa è la ragione per cui si sta verificando un errore. Non esiste l'indice email, ma probabilmente esiste un indice guests_email_unique.

Dare questa migrazione un colpo:

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

     }); 
    } 

} 

Capisco che è un po 'di confusione, che durante la creazione di un indice di specificare i nomi delle colonne, ma quando far cadere l'indice successivamente è necessario fornire il nome completo dell'indice.

Si prega di notare che ho anche modificato il metodo down(), in modo che esso ritorni a rilasciare l'indice univoco aggiungendolo nuovamente.

+0

Hai salvato la mia compagna di vita :) – ihue

+0

Felice di essere al servizio! – stratedge

7

Con official documentation Potete vedere seguente:

Se si passa una serie di colonne in un metodo che scende indici, il nome di indice convenzionale verrà generato in base al nome della tabella, colonne e tipo di chiave :

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



si può cadere semplicemente usando [] intorno nome campo:

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

Questa è la risposta migliore secondo me in quanto consente a Laravel di determinare il nome della chiave utilizzando il processo che esegue per crearlo. – Fireynis

+0

@Fireynis grazie per la tua opinione (; – num8er