<?php
declare(strict_types=1);
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
/**
* Auto-generated Migration: Please modify to your needs!
*/
final class Version20180813223111 extends AbstractMigration
{
public function up(Schema $schema): void
{
// this up() migration is auto-generated, please modify it to your needs
$this->abortIf('mysql' !== $this->connection->getDatabasePlatform()->getName(), 'Migration can only be executed safely on \'mysql\'.');
$this->addSql('
CREATE TABLE issue_participant (
id INT AUTO_INCREMENT NOT NULL,
issue_id INT DEFAULT NULL,
user_id INT DEFAULT NULL,
viewed TINYINT(1) NOT NULL,
unread TINYINT(1) NOT NULL,
INDEX IDX_B5D43EB55E7AA58C (issue_id),
INDEX IDX_B5D43EB5A76ED395 (user_id),
PRIMARY KEY(id)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB
');
$stmt = $this->connection->prepare('SELECT id, participants FROM issues');
$stmt->execute();
while ($row = $stmt->fetch(\PDO::FETCH_OBJ)) {
$participants = $row->participants ? unserialize($row->participants) : [];
if ($participants && \count($participants)) {
foreach ($participants as $key => $value) {
$this->addSql('INSERT INTO issue_participant (issue_id, user_id, viewed, unread) VALUES (:issue_id, :user_id, :viewed, :unread)', [
'issue_id' => $row->id,
'user_id' => $key,
'viewed' => (int) ($value['viewed'] ?? true),
'unread' => (int) ($value['unread'] ?? true),
]);
}
}
}
$this->addSql('RENAME TABLE issues TO issue');
$this->addSql('ALTER TABLE issue ENGINE = InnoDB');
$this->addSql('ALTER TABLE issue CHARACTER SET = utf8mb4');
$this->addSql('UPDATE issue SET status = 0 WHERE status IS NULL');
$this->addSql('
ALTER TABLE issue
DROP participants,
CHANGE administrators_id user_id INT DEFAULT NULL,
CHANGE labels_id tag_id INT DEFAULT NULL,
CHANGE title name VARCHAR(255) NOT NULL,
CHANGE status enabled TINYINT(1) NOT NULL,
CHANGE date_added created_at DATETIME NOT NULL,
CHANGE last_modified modified_at DATETIME NOT NULL,
CHANGE date_closed closed_at DATETIME DEFAULT NULL
');
$this->addSql('DROP INDEX idx_title ON issue');
$this->addSql('DROP INDEX idx_labels_id ON issue');
$this->addSql('DROP INDEX idx_administrators_id ON issue');
$this->addSql('CREATE INDEX idx_name ON issue (name)');
$this->addSql('CREATE INDEX IDX_12AD233EA76ED395 ON issue (user_id)');
$this->addSql('CREATE INDEX IDX_12AD233EBAD26311 ON issue (tag_id)');
$this->addSql('RENAME TABLE issues_comments TO issue_comment');
$this->addSql('ALTER TABLE issue_comment ENGINE = InnoDB');
$this->addSql('ALTER TABLE issue_comment CHARACTER SET = utf8mb4');
$this->addSql('
ALTER TABLE issue_comment
CHANGE issues_id issue_id INT DEFAULT NULL,
CHANGE administrators_id user_id INT DEFAULT NULL,
CHANGE body body LONGTEXT DEFAULT NULL,
CHANGE type type VARCHAR(255) DEFAULT NULL,
CHANGE date_added created_at DATETIME NOT NULL,
CHANGE last_modified modified_at DATETIME NOT NULL
');
$this->addSql('UPDATE issue_comment SET type = \'comment\' WHERE type = \'0\'');
$this->addSql('UPDATE issue_comment SET type = \'close\' WHERE type = \'1\'');
$this->addSql('UPDATE issue_comment SET type = \'reopen\' WHERE type = \'2\'');
$this->addSql('ALTER TABLE issue_comment CHANGE type type ENUM(\'comment\', \'close\', \'reopen\') DEFAULT NULL COMMENT \'(DC2Type:IssueCommentType)\'');
$this->addSql('DROP INDEX idx_issues_id ON issue_comment');
$this->addSql('DROP INDEX idx_administrators_id ON issue_comment');
$this->addSql('CREATE INDEX IDX_318C178D5E7AA58C ON issue_comment (issue_id)');
$this->addSql('CREATE INDEX IDX_318C178DA76ED395 ON issue_comment (user_id)');
$this->addSql('RENAME TABLE issues_labels TO issue_tag');
$this->addSql('ALTER TABLE issue_tag ENGINE = InnoDB');
$this->addSql('ALTER TABLE issue_tag CHARACTER SET = utf8mb4');
$this->addSql('
ALTER TABLE issue_tag
CHANGE name name VARCHAR(255) NOT NULL,
CHANGE color color VARCHAR(6) DEFAULT NULL
');
$this->addSql('UPDATE issue SET user_id = NULL WHERE user_id NOT IN (SELECT id FROM user)');
$this->addSql('UPDATE issue SET tag_id = NULL WHERE tag_id NOT IN (SELECT id FROM issue_tag)');
$this->addSql('DELETE FROM issue_comment WHERE issue_id NOT IN (SELECT id FROM issue)');
$this->addSql('UPDATE issue_comment SET user_id = NULL WHERE user_id NOT IN (SELECT id FROM user)');
$this->addSql('DELETE FROM issue_participant WHERE issue_id NOT IN (SELECT id FROM issue)');
$this->addSql('DELETE FROM issue_participant WHERE user_id NOT IN (SELECT id FROM user)');
$this->addSql('ALTER TABLE issue ADD CONSTRAINT FK_1J15B9935J4Y8O1T FOREIGN KEY (user_id) REFERENCES user (id) ON DELETE SET NULL');
$this->addSql('ALTER TABLE issue ADD CONSTRAINT FK_12AD233EBAD26311 FOREIGN KEY (tag_id) REFERENCES issue_tag (id) ON DELETE SET NULL');
$this->addSql('ALTER TABLE issue_comment ADD CONSTRAINT FK_0N21F6719N6T3W7A FOREIGN KEY (issue_id) REFERENCES issue (id) ON DELETE CASCADE');
$this->addSql('ALTER TABLE issue_comment ADD CONSTRAINT FK_7L07T2777T6T8I8Z FOREIGN KEY (user_id) REFERENCES user (id) ON DELETE SET NULL');
$this->addSql('ALTER TABLE issue_participant ADD CONSTRAINT FK_6Z39K5823P9X7A0L FOREIGN KEY (issue_id) REFERENCES issue (id) ON DELETE CASCADE');
$this->addSql('ALTER TABLE issue_participant ADD CONSTRAINT FK_B5D43EB5A76ED395 FOREIGN KEY (user_id) REFERENCES user (id) ON DELETE CASCADE');
}
public function down(Schema $schema): void
{
// this down() migration is auto-generated, please modify it to your needs
$this->abortIf('mysql' !== $this->connection->getDatabasePlatform()->getName(), 'Migration can only be executed safely on \'mysql\'.');
$this->addSql('ALTER TABLE issue_participant DROP FOREIGN KEY FK_B5D43EB5A76ED395');
$this->addSql('ALTER TABLE issue_participant DROP FOREIGN KEY FK_6Z39K5823P9X7A0L');
$this->addSql('ALTER TABLE issue_comment DROP FOREIGN KEY FK_7L07T2777T6T8I8Z');
$this->addSql('ALTER TABLE issue_comment DROP FOREIGN KEY FK_0N21F6719N6T3W7A');
$this->addSql('ALTER TABLE issue DROP FOREIGN KEY FK_12AD233EBAD26311');
$this->addSql('ALTER TABLE issue DROP FOREIGN KEY FK_1J15B9935J4Y8O1T');
$this->addSql('RENAME TABLE issue TO issues');
$this->addSql('ALTER TABLE issues ENGINE = MyISAM');
$this->addSql('ALTER TABLE issues CHARACTER SET = latin1');
$this->addSql('
ALTER TABLE issues
ADD participants LONGTEXT DEFAULT NULL COMMENT \'(DC2Type:array)\' AFTER labels_id,
CHANGE user_id administrators_id INT NOT NULL,
CHANGE tag_id labels_id INT NOT NULL,
CHANGE name title VARCHAR(255) DEFAULT NULL,
CHANGE enabled status TINYINT(1) DEFAULT \'0\',
CHANGE created_at date_added DATETIME DEFAULT NULL,
CHANGE modified_at last_modified DATETIME DEFAULT NULL,
CHANGE closed_at date_closed DATETIME DEFAULT NULL
');
$this->addSql('DROP INDEX idx_name ON issues');
$this->addSql('DROP INDEX IDX_12AD233EA76ED395 ON issues');
$this->addSql('DROP INDEX IDX_12AD233EBAD26311 ON issues');
$this->addSql('CREATE INDEX idx_title ON issues (title)');
$this->addSql('CREATE INDEX idx_labels_id ON issues (labels_id)');
$this->addSql('CREATE INDEX idx_administrators_id ON issues (administrators_id)');
$stmt = $this->connection->prepare('SELECT * FROM issue_participant');
$stmt->execute();
$issues = [];
while ($row = $stmt->fetch(\PDO::FETCH_OBJ)) {
$issues[$row->issue_id][] = [
$row->user_id = [
'viewed' => $row->viewed,
'unread' => $row->unread,
],
];
}
foreach ($issues as $key => $value) {
$participants = serialize($value);
$this->addSql('UPDATE issues SET participants = :participants WHERE id = :id', [
'participants' => $participants,
'id' => $key,
]);
}
$this->addSql('DROP TABLE issue_participant');
$this->addSql('RENAME TABLE issue_comment TO issues_comments');
$this->addSql('ALTER TABLE issues_comments ENGINE = InnoDB');
$this->addSql('ALTER TABLE issues_comments CHARACTER SET = utf8mb4');
$this->addSql('UPDATE issues_comments SET type = \'0\' WHERE type = \'comment\'');
$this->addSql('UPDATE issues_comments SET type = \'1\' WHERE type = \'close\'');
$this->addSql('UPDATE issues_comments SET type = \'2\' WHERE type = \'reopen\'');
$this->addSql('
ALTER TABLE issues_comments
CHANGE issue_id issues_id INT NOT NULL,
CHANGE user_id administrators_id INT NOT NULL,
CHANGE body body LONGTEXT DEFAULT NULL,
CHANGE type type TINYINT(1) DEFAULT \'0\',
CHANGE created_at date_added DATETIME DEFAULT NULL,
CHANGE modified_at last_modified DATETIME DEFAULT NULL
');
$this->addSql('DROP INDEX IDX_318C178D5E7AA58C ON issues_comments');
$this->addSql('DROP INDEX IDX_318C178DA76ED395 ON issues_comments');
$this->addSql('CREATE INDEX idx_issues_id ON issues_comments (issues_id)');
$this->addSql('CREATE INDEX idx_administrators_id ON issues_comments (administrators_id)');
$this->addSql('RENAME TABLE issue_tag TO issues_labels');
$this->addSql('ALTER TABLE issues_labels ENGINE = MyISAM');
$this->addSql('ALTER TABLE issues_labels CHARACTER SET = latin1');
$this->addSql('
ALTER TABLE issues_labels
CHANGE name name VARCHAR(64) NOT NULL,
CHANGE color color VARCHAR(6) DEFAULT NULL
');
}
}