在迁移中运行原始SQL

时间:2015-02-28 21:44:34

标签: 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);
});

也试过

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

和双引号等。我在运行迁移时总是得到以下信息:

  

语法错误或访问冲突:1064 SQL语法中出错;检查
         与您的MariaDB服务器版本对应的手册,以便在第1行的''用户'修改'年龄'DATETIME'附近使用正确的语法

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

2 个答案:

答案 0 :(得分:35)

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

alter table `users` modify `age` datetime

在这种特殊情况下,您可以省略转义

alter table users modify age datetime

答案 1 :(得分:26)

问题(如@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();
});

请注意,由于Doctrine中存在错误,最后一个解决方案有时会引发错误,如果表中包含枚举(通常不是您要更改的列),通常会出现错误。

有关详细信息,请参阅Laravel Database Migration - Modifying Column