Удалить столбец в методе postUp () - PullRequest
4 голосов
/ 06 апреля 2011

Возможно ли удалить столбец в методе миграции postUp () или он предназначен только для манипулирования данными?

1 Ответ

4 голосов
/ 30 мая 2011

Я не знаю, какую версию Doctrine Migrations вы используете.Тем не менее, я просто столкнулся с тем же вопросом при работе с Doctrine Migrations 2.0 и начал копаться в коде.При рассмотрении того, как создается версия, кажется, что использование объекта Schema для внесения изменений в метод postUp () не вступает в силу.

Однако при дальнейшем рассмотрении это действительно имеет смысл.Каждая версия миграции предназначена для изменения структуры базы данных.Это происходит в методах up () и down () каждой миграции.Похоже, что postUp () в основном предназначен для очистки постструктурных изменений (т.е. манипулирования данными).Любые дальнейшие структурные изменения, которые вы намеревались внести в метод postUp (), должны быть внесены в последующий файл миграции.

Например, я пытался создать новую таблицу, которая будет содержать два столбца из предыдущей таблицы.Я намеревался удалить эти столбцы из предыдущей таблицы после того, как перенес данные в новую таблицу.Код выглядит следующим образом:

class Version20110512223208 extends AbstractMigration
{
    protected $customerRepository;

    protected $evernoteRepository;

    public function up(Schema $schema)
    {
        $table = $schema->createTable('customer_evernote');
        $table->addOption('type', 'INNODB');
        $table->addOption('charset', 'utf8');
        $table->addOption('collate', 'utf8_unicode_ci');

        // Columns.
        $table->addColumn('customer_id', 'bigint', array(
            'length'    => 20,
            'notnull'   => true,
            'autoincrement' => false));
        $table->addColumn('integration_date', 'datetime', array('notnull' => true));
        $table->addColumn('oauth_token', 'string', array(
            'length'    => 255,
            'notnull'   => true));
        $table->addColumn('oauth_shard_id', 'string', array(
            'length'    => 4,
            'notnull'   => true,
            'fixed'     => true));

        $table->setPrimaryKey(array('customer_id'), 'pk_customer_id');
        $table->addForeignKeyConstraint($schema->getTable('customer'), array('customer_id'), array('id'));
    }

    public function down(Schema $schema)
    {
        $schema->dropTable('customer_evernote');
    }

    public function preUp(Schema $schema)
    {
        $this->addSql("ALTER TABLE `customer` ENGINE = INNODB");
    }

    public function postUp(Schema $schema)
    {
        $this->skipIf($this->version->isMigrated() !== true, 'postUp can only apply if migration completes.');

        // Copy the data from the customer table into the newly created customer_evernote table.
        $this->doctrine = \Zend_Registry::get('doctrine');
        $this->entityManager = $this->doctrine->getEntityManager();
        $this->customerRepository = $this->entityManager->getRepository('My\Entity\Customer');
        $this->evernoteRepository = $this->entityManager->getRepository('My\Entity\CustomerEvernote');
        $customers = $this->customerRepository->findAll();

        foreach ($customers as $customer)
        {
            $evernoteRecord = new \My\Entity\CustomerEvernote();
            $evernoteRecord->setCustomerId($customer->getId());
            $evernoteRecord->setCustomer($customer);
            $evernoteRecord->setOauthToken($customer->getEvernoteOauthToken());
            $evernoteRecord->setOauthShardId($customer->getEvernoteOauthShardId());
            $evernoteRecord->setIntegrationDate(new \DateTime("now"));

            $this->evernoteRepository->saveEvernote($evernoteRecord);
        }

        // Drop the columns from the existing customer table.
        $table = $schema->getTable('customer');
        $table->dropColumn('evernote_oauth_token');
        $table->dropColumn('evernote_oauth_shard_id');
    }

    public function preDown(Schema $schema)
    {
        // Create the existing columns in the customer table.
        $table = $schema->getTable('customer');
        $table->addColumn('evernote_oauth_token', 'string', array(
            'length'    => 255,
            'notnull'   => false));
        $table->addColumn('evernote_oauth_shard_id', 'string', array(
            'length'    => 4,
            'notnull'   => false,
            'fixed'     => true));

        // Copy the data to the customer table.
        $this->doctrine = \Zend_Registry::get('doctrine');
        $this->entityManager = $this->doctrine->getEntityManager();
        $this->customerRepository = $this->entityManager->getRepository('My\Entity\Customer');
        $this->evernoteRepository = $this->entityManager->getRepository('My\Entity\CustomerEvernote');

        $integrations = $this->evernoteRepository->findAll();

        foreach ($integrations as $integration)
        {
            $integration->getCustomer()->setEvernoteOauthToken($integration->getOauthToken());
            $integration->getCustomer()->setEvernoteOauthShardId($integration->getOauthShardId());

            $this->customerRepository->saveCustomer($integration->getCustomer());
        }
    }
}

На самом деле, если бы я переместил код в конце postUp () в новую версию up () и код в начале preDown () вВ методе down () новой версии я получаю те же результаты, что и в предыдущем классе, только в два отдельных шага.При таком подходе я гарантирую, что у меня есть структурные изменения строго , происходящие в моих методах вверх и вниз.

...