Я пытался с любым синтаксисом и не могу думать, как я могу написать это правильно:
Schema::table('users', function(Blueprint $table){ $sql = <<<SQL ALTER TABLE 'users' MODIFY 'age' DATETIME SQL; DB::connection()->getPdo()->exec($sql); });
также пытался
DB::statement('ALTER TABLE \'users\' MODIFY COLUMN DATETIME);
и двойные кавычки и т. д. При выполнении миграции я всегда получаю следующее:
Ошибка синтаксиса или нарушение доступа: 1064 У вас есть ошибка в синтаксисе SQL; проверить
руководство, соответствующее вашей версии сервера MariaDB, для правильного синтаксиса для использования рядом с '' users 'MODIFY' age 'DATETIME' в строке 1
Да, я проверил, MariaDB использует синтаксис MySQL (по крайней мере для этого случая).
Используйте обратные тики вместо одиночных кавычек для исключения идентификаторов в MySQL:
$sql = 'ALTER TABLE `users` MODIFY `age` DATETIME';
В этом конкретном случае вы можете вообще отказаться от экранирования .
Проблема (как сказал @postashin) – это обратные шаги.
Что касается Laravel 5 (не знаю о Laravel 4), вы могли бы сделать это:
DB::statement('ALTER TABLE `users` MODIFY `age` DATETIME');
На самом деле вам даже не нужны обратные тики, так как им не нужно бежать. Так что вы могли бы просто написать:
DB::statement('ALTER TABLE users MODIFY age DATETIME');
Это не нужно в закрытии, если вы просто выполняете инструкцию базы данных.
Однако лучший подход к тому, что вы делаете, заключается в следующем:
Schema::table('users', function(Blueprint $table) { $table->dateTime('age')->change(); });
Обратите внимание, что последнее решение иногда может вызывать ошибку из-за ошибки в Doctirine, которая обычно возникает, если у вас есть перечисление в таблице (а не только столбец, который вы меняете).
Для получения дополнительной информации см. https://laravel.com/docs/5.4/migrations#modification-columns