あじちゃんのブログ。備忘録。

〜エンジニアもOLなんですかね?

larave5.5:Unknown database type enum requested を解決できた

↓この記事、解決しました!!

blog.azimicat.com

ドキュメントが間違っていました。

enumカラムの名前の変更はサポートされていないと書いてありましたが、実際にはenumカラムを含むテーブル上の任意のカラムの名前を変更したときにエラーが発生します。

 

そしてこれには回避策がありました。

ずばりDoctrine に enum が文字列であることを伝えればよいです。

 

$platform = Schema::getConnection()->getDoctrineSchemaManager()->getDatabasePlatform();
$platform->registerDoctrineTypeMapping('enum', 'string');

 

これをこんな感じでいれてあげればOK

public function up()
{
  // enum を string 扱いするように指示する
  $platform = Schema::getConnection()->getDoctrineSchemaManager()->getDatabasePlatform();
  $platform->registerDoctrineTypeMapping('enum', 'string');

  // カラム名を変更
  Schema::table('animals', function (Blueprint $table) {
      $table->renameColumn('Lion', 'Cat');
  });

  // string型へ変更
  Schema::table('newsBotPrograms', function (Blueprint $table) {
      $table->string('Cat')->change();
  });
}

 

解決はできたけど、バグのようなので「update で解決されるといいね」というものらしい。

larave5.5 において enum を含む table では getColumnType() は使用できない

以下の記事で解決しました!

 

blog.azimicat.com


以下元記事 


以下のようにカラムのタイプを確認してchange()をかけようとしたところ、エラー (Unknown database type enum requested) が発生する

if (!Schema::getColumnType('animal', 'cat') === 'int') {
  $table->staring('cat')->change();
}

似ているissueが上がっていたのでみてみたけど結局は 使えない という結論になった。

https://github.com/cloudstudio/resource-generator/issues/10

このメソッドにquick try/catchを入れて、DBALExceptionsをキャッチしたときに‘enum’を返すとうまくいくようです。

って感じのことが書かれてた。わからん。

 

カラム属性の確認をするのに、

vendor/laravel/framework/src/Illuminate/Database/Schema/Builder.php

public function getColumnType($table, $column) を使おうとしたのだけれど

このテーブルにenumが含まれるとDBALExceptionsが飛ぶ様子。

正確にはこれが返ってくる

In AbstractPlatform.php line 434:
  Unknown database type enum requested, Doctrine\DBAL\Platforms\MySQL57Platform may not support it.  

 

MySQL57Platform は上記URLの人が言うMarinaDB同様に enum に対応していないので使えないよってことらしい。(読んだそのままだ...

 

どうしようもないのでチェックは諦めることにした。

せっかくあるのに使えないなんて残念。

ルーティングが正しそうなのに死ぬときは post と バリデーションエラーによる redirect の罠

Symfony \ Component \ HttpKernel \ Exception \ MethodNotAllowedHttpExceptionNo message

このエラー時に、疑うべきこと。

  • ルーティング間違い
  • post時のバリデーション落ちによるループエラー

→ どういうことかというと...

controller に post の function A, function B があるとして
A
→ post + param
→ Bに進むがバリデーションで落ちる
→ リダイレクト(問答無用でget)
→ Aに戻って画面を表示したいが get なので 403 エラー

 

確認順序

  • バリデーションを一番ゆるいものにしてみる(ガバガバ運用)
  • ルーティングを確認してみる(似たような名前で躓いている可能性)
  • HTMLを最も単純なものにする(クライアントのエラーか、サーバーのエラーかを切り分ける)
  • fetchのレスポンスを確認してみる(サーバーから帰ってきたレスポンスによってクライアントがリダイレクトしている可能性を排除)
  • typoを確認してみる(最も見つけにくいので最後)