2015-02-28 19 views
19

stavo cercando con tutto ciò sintassi e non può pensare come posso scrivere questo in modo corretto:Run SQL prime in migrazione

Schema::table('users', function(Blueprint $table){ 
    $sql = <<<SQL 
     ALTER TABLE 'users' MODIFY 'age' DATETIME 
    SQL; 
    DB::connection()->getPdo()->exec($sql); 
}); 

provato anche con

DB::statement('ALTER TABLE \'users\' MODIFY COLUMN DATETIME); 

e doppie virgolette e così via . Ricevo sempre quanto segue quando eseguo la migrazione:

Errore di sintassi o violazione di accesso: 1064 Si è verificato un errore nella sintassi SQL; controllare
il manuale che corrisponde alla versione del server MariaDB per la sintassi diritto di utilizzare vicino a '' utenti Modifica 'età' DATETIME' at line 1

Sì, ho controllato, MariaDB utilizza la sintassi di MySQL (a almeno per questo caso).

+0

Che cosa stai cercando di fare? – Philipp

risposta

28

Usa back-zecche invece di apici per sfuggire identificatori in MySQL:

$sql = 'ALTER TABLE `users` MODIFY `age` DATETIME'; 

In questo caso particolare è possibile omettere sfuggire a tutti.

+6

C'è un motivo per cui la query deve trovarsi all'interno di una chiusura dello schema se non si utilizza l'oggetto Blueprint? –

+0

Non è necessario chiudere lo schema, sono solo query dipendenti a parte. Inoltre puoi eseguire query in DB :: statement ('QUERY'). – KorbenDallas

+0

@KorbenDallas: Nel caso di questa domanda si trattava principalmente del motivo per cui il suo approccio non funziona in MySQL, non su come renderlo migliore in Laravel (che non mi è familiare per niente) – potashin

14

Il problema (come ha detto @postashin) è stato il backtick.

Dal laravel 5 (non sono sicuro laravel 4), che avrebbe potuto fare questo:

DB::statement('ALTER TABLE `users` MODIFY `age` DATETIME'); 

In realtà non hai nemmeno bisogno retro zecche in quanto non hanno bisogno di fuggire. Così si potrebbe avere appena scritto:

DB::statement('ALTER TABLE users MODIFY age DATETIME'); 

Non è necessario questo la chiusura o se sono solo eseguendo un'istruzione di database.

Tuttavia un approccio migliore per quello che stai facendo è la seguente:

Schema::table('users', function(Blueprint $table) { 
    $table->dateTime('age')->change(); 
}); 

Nota l'ultima soluzione può a volte generare un errore a causa di un bug in Doctirine, che si verifica in genere se si dispone di un enum nel tabella (non solo la colonna che si sta modificando).

Per ulteriori informazioni, vedere: https://laravel.com/docs/5.4/migrations#modifying-columns

Problemi correlati