web-dev-qa-db-ja.com

移行時に生のSQLを実行する

私はどんな構文でも試していましたが、これをどのように正しく書くことができるか考えられません:

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の構文を使用します(少なくともこの場合)。

33
Milkncookiez

MySQLで識別子をエスケープするには、一重引用符ではなくバックティックを使用します。

alter table `users` modify `age` datetime

この特定のケースでは、エスケープをまったく省略できます

alter table users modify age datetime
37
potashin

問題は(@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データベースの移行-列の変更 を参照してください

30
Yahya Uddin