2015-02-28 6 views
19

Ich war mit dem, was Syntax versuche und denken kann, nicht, wie kann ich das richtig schreiben:Run raw SQL in der Migration

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

auch versucht, mit

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

und doppelten Anführungszeichen und so weiter . Beim Ausführen der Migration erhalte ich immer Folgendes:

Syntaxfehler oder Zugriffsverletzung: 1064 Sie haben einen Fehler in Ihrer SQL-Syntax. überprüfen
das Handbuch, das zu Ihrer MariaDB Server-Version für die richtige Syntax entspricht in der Nähe zu verwenden '' Benutzer MODIFY 'Alter' DATETIME-‘at line 1

Ja, ich habe überprüft, verwendet MariaDB MySQL-Syntax (at zumindest für diesen Fall).

+0

Was genau wollen Sie tun? – Philipp

Antwort

28

Verwenden Back-Zecken anstelle von einfachen Anführungszeichen Bezeichner in MySQL zu entkommen:

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

In diesem speziellen Fall, dass Sie bei allen Flucht weglassen.

+6

Gibt es einen Grund dafür, dass sich die Abfrage innerhalb einer Schema-Closure befindet, wenn das Blueprint-Objekt nicht verwendet wird? –

+0

Sie müssen nicht Schema schließen, es ist nur separate abhängige Abfragen. Sie können auch eine Abfrage in DB :: statement ('QUERY') ausführen. – KorbenDallas

+0

@KorbenDallas: Bei dieser Frage ging es hauptsächlich darum, warum sein Ansatz in MySQL nicht funktioniert, nicht darum, wie man es in Laravel besser machen kann (mit dem ich überhaupt nicht vertraut bin) – potashin

14

Das Problem (wie @postashin sagte) war die Backticks.

Ab Laravel 5 (nicht sicher Laravel 4), können Sie dies getan haben könnte:

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

In der Tat Sie die Rückseite nicht einmal brauchte Zecken, wie sie entkommen nicht brauchen. So könnten Sie haben gerade geschrieben:

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

Sie diese entweder in der Schließung nicht brauchen, wenn Sie nur eine Datenbank-Anweisung ausführen.

jedoch ein besserer Ansatz zu dem, was Sie tun, ist wie folgt:

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

Beachten Sie die letzte Lösung kann manchmal einen Fehler erhöhen aufgrund eines Fehlers in Doctirine, die in der Regel tritt auf, wenn Sie eine ENUM in der haben Tabelle (nicht nur die Spalte, die Sie ändern).

Weitere Informationen finden Sie unter: https://laravel.com/docs/5.4/migrations#modifying-columns