私はどんな構文でも試していましたが、これをどのように正しく書くことができるか考えられません:
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行目の '' users 'MODIFY' age 'DATETIME'の近くで使用する正しい構文
はい、MariaDBはMySQLの構文を使用します(少なくともこの場合)。
MySQLで識別子をエスケープするには、一重引用符ではなくバックティックを使用します。
alter table `users` modify `age` datetime
この特定のケースでは、エスケープをまったく省略できます:
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();
});
最後の解決策では、Doctrineのバグが原因でエラーが発生することがあります。これは通常、テーブルに列挙型(変更する列だけでなく)がある場合に発生します。
詳細については、 Laravelデータベースの移行-列の変更 を参照してください