Php 在迁移中运行原始SQL

Php 在迁移中运行原始SQL,php,mysql,sql,laravel,laravel-4,Php,Mysql,Sql,Laravel,Laravel 4,我试着使用任何语法,但想不出如何正确地编写: Schema::table('users', function(Blueprint $table){ $sql = <<<SQL ALTER TABLE 'users' MODIFY 'age' DATETIME SQL; DB::connection()->getPdo()->exec($sql); }); 和双引号等等。运行迁移时,我始终会得到以下信息: 语法错误或访问冲突:

我试着使用任何语法,但想不出如何正确地编写:

Schema::table('users', function(Blueprint $table){
    $sql = <<<SQL
        ALTER TABLE 'users' MODIFY 'age' DATETIME
    SQL;
    DB::connection()->getPdo()->exec($sql);
});
和双引号等等。运行迁移时,我始终会得到以下信息:

语法错误或访问冲突:1064您的SQL语法有错误;检查
与您的MariaDB服务器版本相对应的手册,用于第1行“用户”修改“年龄”日期时间附近使用的正确语法


是的,我已经检查过了,MariaDB使用MySQL的语法(至少在这种情况下是这样)。

使用反勾号而不是单引号来转义MySQL中的标识符:

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();
});
注意,上一个解决方案有时会由于条令中的错误而引发错误,如果表中有枚举(而不仅仅是要更改的列),通常会发生错误


有关更多信息,请参见

你到底想做什么?我经历过多次同样的经历。似乎MySQL或DB::statement不喜欢多行alter语句。如果不使用Blueprint对象,是否有理由将查询放在架构闭包中?您不需要架构闭包,它只是独立的查询。您还可以在DB::statement('query')中运行查询。@KorbenDallas:在这个问题中,主要是关于为什么他的方法在MySQL中不起作用,而不是关于如何在Laravel中使其更好(我对使用Laravel一点都不熟悉)
DB::statement('ALTER TABLE users MODIFY age DATETIME');
Schema::table('users', function(Blueprint $table) {
    $table->dateTime('age')->change();
});