app/DoctrineMigrations/Version20251119155734.php line 1

Open in your IDE?
  1. <?php
    
    declare(strict_types=1);
    
    namespace DoctrineMigrations;
    
    use Doctrine\DBAL\Schema\Schema;
    use Doctrine\Migrations\AbstractMigration;
    
    /**
     * dtb_memberテーブルの無効なlogin_date値を修正
     */
    final class Version20251119155734 extends AbstractMigration
    {
        public function getDescription(): string
        {
            return 'dtb_memberテーブルのlogin_dateカラムの無効な日時値(0000-00-00 00:00:00)をNULLに修正';
        }
    
        public function up(Schema $schema): void
        {
            // MySQLの場合
            if ($this->connection->getDatabasePlatform()->getName() === 'mysql') {
                // 一時的にSQLモードを変更して無効な日時値を許容
                $this->addSql("SET SESSION sql_mode = ''");
                
                // 無効な日時値をNULLに更新
                $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'");
                
                // SQLモードを元に戻す
                $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'");
            }
            // PostgreSQLの場合は通常この問題は発生しないが、念のため
            elseif ($this->connection->getDatabasePlatform()->getName() === 'postgresql') {
                // PostgreSQLでは '0000-00-00' は既にエラーになるため、特別な処理は不要
                // ただし、万が一の場合に備えて、非常に古い日付をNULLにする
                $this->addSql("UPDATE dtb_member SET login_date = NULL WHERE login_date < '1000-01-01 00:00:00'");
            }
        }
    
        public function down(Schema $schema): void
        {
            // このマイグレーションはデータクリーニングのため、ロールバックは不要
            // 無効な値に戻すことは望ましくない
        }
    }