【Laravel】マイグレーションで大文字と小文字を区別するカラムの作り方

マイグレーションファイルに記述する「カラムタイプ」の指定では大文字・小文字を区別することができないので生のSQLを書く必要がある。

database/migrations/2020_10_31_160700_create_hoges_table.php


public function up()
{
    Schema::create('hoges', function (Blueprint $table) {
        $table->string('name'); // カラムは宣言する(型は↓で変えるので何でも良い)
    });

    // スキーマビルダではBINARY属性を付けられないので別途付与する
    //     $table->binary()はあるがBLOB型を宣言するためのものであり、ここでは使えないので注意
    // BINARY属性を付けるとカラムが自動的にnullableになってしまうので、合わせてNOT NULLも明示する
    // DB::statement('ALTER TABLE hoges MODIFY name varchar(255) BINARY NOT NULL'); // こちらはテスト時に何故かエラーになる
    DB::raw('ALTER TABLE hoges MODIFY name varchar(255) BINARY NOT NULL');
}

なお、DB::statement()で記述しても通常のマイグレーション自体は正常に完了するし大文字と小文字の区別も問題なく行われるが、テスト実行時のマイグレーション時にはエラーが発生するのでDB::raw()を使う方が良い(理由は不明なので判明し次第追記予定)。

テスト実行時のマイグレーションで発生するエラー


Illuminate\Database\QueryException 
SQLSTATE[HY000]: General error: 1 near "MODIFY": syntax error (SQL: ALTER TABLE hoges MODIFY name varchar(255) BINARY NOT NULL)

at vendor/laravel/framework/src/Illuminate/Database/Connection.php:671
  667|     // If an exception occurs when attempting to run a query, we'll format the error
  668|     // message to include the bindings with SQL, which will make this exception a
  669|     // lot more helpful to the developer instead of just the database's errors.
  670|     catch (Exception $e) {
> 671|         throw new QueryException(
  672|             $query, $this->prepareBindings($bindings), $e
  673|         );
  674|     }

参考

https://stackoverrun.com/ja/q/12512907

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です