27

我有这段代码但不起作用:

<?php

namespace Application\Migrations;

use Doctrine\DBAL\Migrations\AbstractMigration,
    Doctrine\DBAL\Schema\Schema;

/**
 * Auto-generated Migration: Please modify to your need!
 */
class Version20131021150555 extends AbstractMigration
{

    public function up(Schema $schema)
    {
        // this up() migration is auto-generated, please modify it to your needs
        $this->abortIf($this->connection->getDatabasePlatform()->getName() != "mysql", "Migration can only be executed safely on 'mysql'.");

        $this->addSql("ALTER TABLE person ADD tellphone LONGTEXT DEFAULT NULL");

        $em = $em = $this->getDoctrine()->getEntityManager();
        $persons = $em->getRepository('AutogestionBundle:Person')->fetchAll();

        foreach($persons as $person){
            $person->setTellPhone($person->getCellPhone());
            $em->persist($person);                                                                            
        }
        $em->flush(); 
    }

    public function down(Schema $schema)
    {
        // this down() migration is auto-generated, please modify it to your needs
        $this->abortIf($this->connection->getDatabasePlatform()->getName() != "mysql", "Migration can only be executed safely on 'mysql'.");

        $this->addSql("ALTER TABLE person DROP tellphone");
    }
}

我在手机中的新字段告诉电话中添加了信息。

谢谢

4

3 回答 3

71

这可能是一个较旧的帖子,但同时问题已解决,实际上是当前文档的一部分。

请参阅http://symfony.com/doc/current/bundles/DoctrineMigrationsBundle/index.html#container-aware-migrations

// ...
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\ContainerAwareTrait;

class Version20130326212938 extends AbstractMigration implements ContainerAwareInterface
{
    use ContainerAwareTrait;

    public function up(Schema $schema)
    {
        // ... migration content
    }

    public function postUp(Schema $schema)
    {
        $em = $this->container->get('doctrine.orm.entity_manager');
        // ... update the entities
    }
}
于 2014-09-21T14:47:19.777 回答
13

我确实意识到这有点过时,但要从我的错误中吸取教训,并且:

甚至不要考虑在迁移中使用实体管理器

特别是以您想要使用它的方式 - 获取实体存储库。

这就是为什么。

想象一下你有一个DogEntitywith 字段的情况$name。您现在基于该实体生成一个迁移文件(比如说它的 Version1)。到现在为止还挺好。

接下来,您想使用实体管理器获取该存储库DogEntity,更新记录,对这些实体执行您需要执行的任何操作。这行得通,没关系(假设这个迁移文件的名称为 Version2)。

现在,您$color向您的 . 添加一个字段DogEntity,再次生成迁移(它是一个名为 Version3 的文件)。而且没关系...

...直到您尝试从一开始就运行所有迁移。在那一刻,错误将在 Version2 文件的迁移过程中引发。为什么?因为实体管理器color在数据库中查找字段。但是该字段是稍后在 Version3 文件中创建的。

TLDR:实体管理器会查找您当前在实体中拥有的列,这些列可能会在从一开始就运行迁移时导致问题。

于 2020-02-03T15:52:46.627 回答
8

postUp()您必须在方法中调用您的修改addSql()- 语句将在up()方法完成后执行,因此您的新行(即告诉电话)在方法期间不可用up()

于 2013-10-21T22:38:41.913 回答