Запуск необработанного SQL в миграции

Я пытался с любым синтаксисом и не мог подумать, как я могу написать это правильно:

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 (по крайней мере для этого случая).

Ответы

Ответ 1

Используйте обратные тики вместо одиночных кавычек для удаления идентификаторов в MySQL:

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

В этом конкретном случае вы можете вообще отказаться от экранирования.

Ответ 2

Проблема (как сказал @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#modifying-columns