在迁移中运行原始SQL

Mil*_*iez 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);
});
Run Code Online (Sandbox Code Playgroud)

也尝试过

DB::statement('ALTER TABLE \'users\' MODIFY COLUMN DATETIME);
Run Code Online (Sandbox Code Playgroud)

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

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

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

pot*_*hin 37

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

alter table `users` modify `age` datetime
Run Code Online (Sandbox Code Playgroud)

在这种特殊情况下,你可以省略逃避:

alter table users modify age datetime
Run Code Online (Sandbox Code Playgroud)

  • 如果不使用Blueprint对象,是否有理由将查询置于Schema闭包内? (7认同)

Yah*_*din 31

问题(如@postashin所说)是反击.

从Laravel 5开始(对Laravel 4不太确定),您可以这样做:

DB::statement('ALTER TABLE `users` MODIFY `age` DATETIME');
Run Code Online (Sandbox Code Playgroud)

事实上,你甚至不需要后退,因为它们不需要转义.所以你可以写完:

DB::statement('ALTER TABLE users MODIFY age DATETIME');
Run Code Online (Sandbox Code Playgroud)

如果您只是执行数据库语句,则在闭包中不需要这个.

但是,更好地处理您正在做的事情如下:

Schema::table('users', function(Blueprint $table) {
    $table->dateTime('age')->change();
});
Run Code Online (Sandbox Code Playgroud)

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

有关更多信息,请参阅Laravel数据库迁移 - 修改列