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();
});