<?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
{
// このマイグレーションはデータクリーニングのため、ロールバックは不要
// 無効な値に戻すことは望ましくない
}
}