app/DoctrineMigrations/Version20251119155734.php line 1

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace DoctrineMigrations;
  4. use Doctrine\DBAL\Schema\Schema;
  5. use Doctrine\Migrations\AbstractMigration;
  6. /**
  7.  * dtb_memberテーブルの無効なlogin_date値を修正
  8.  */
  9. final class Version20251119155734 extends AbstractMigration
  10. {
  11.     public function getDescription(): string
  12.     {
  13.         return 'dtb_memberテーブルのlogin_dateカラムの無効な日時値(0000-00-00 00:00:00)をNULLに修正';
  14.     }
  15.     public function up(Schema $schema): void
  16.     {
  17.         // MySQLの場合
  18.         if ($this->connection->getDatabasePlatform()->getName() === 'mysql') {
  19.             // 一時的にSQLモードを変更して無効な日時値を許容
  20.             $this->addSql("SET SESSION sql_mode = ''");
  21.             
  22.             // 無効な日時値をNULLに更新
  23.             $this->addSql("UPDATE dtb_member SET login_date = NULL WHERE login_date = '0000-00-00 00:00:00' OR login_date < '1000-01-01 00:00:00'");
  24.             
  25.             // SQLモードを元に戻す
  26.             $this->addSql("SET SESSION sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'");
  27.         }
  28.         // PostgreSQLの場合は通常この問題は発生しないが、念のため
  29.         elseif ($this->connection->getDatabasePlatform()->getName() === 'postgresql') {
  30.             // PostgreSQLでは '0000-00-00' は既にエラーになるため、特別な処理は不要
  31.             // ただし、万が一の場合に備えて、非常に古い日付をNULLにする
  32.             $this->addSql("UPDATE dtb_member SET login_date = NULL WHERE login_date < '1000-01-01 00:00:00'");
  33.         }
  34.     }
  35.     public function down(Schema $schema): void
  36.     {
  37.         // このマイグレーションはデータクリーニングのため、ロールバックは不要
  38.         // 無効な値に戻すことは望ましくない
  39.     }
  40. }