doctrine 2 orm:schema-tool:update drops column

时间:2014-05-19 15:03:45

标签: php mysql orm doctrine-orm doctrine

我对doctrine 2 orm架构工具的问题是它删除了在父类中定义的列(外键)。

我有以下情况:

namespace mycode\folderA;

class User {
    /**
    * @ManyToOne(targetEntity="Role", inversedBy="users")
    * @JoinColumn(name="role_id", referencedColumnName="id")
    * @var Role
    */
    protected $role;

    //getter and setter
}

运行doctrine orm:schema-tool:update --dump-sql很有用,它创建一个包含所有已定义列的表,并将$ role设置为带索引的外键。好的。

现在我想为一个特殊情况添加一些特殊字段,所以我从我的User类继承。代码看起来像:

namespace mycode\folderB;

use mycode\folderA\User as UserParent;

class User extends UserParent {
    /**
    * @Column(name="special", type="integer", nullable=true)
    * @var integer
    */
    protected $special;

    //getter and setter
}

当我现在运行doctrine orm时:schema-tool:update --dump-sql它显示我添加的列"特殊"但还有以下内容:

DROP INDEX role ON user;
ALTER TABLE user DROP role_id;

我已经尝试在子用户类中定义外键,但没有成功。

所以,我的问题是:我错过了什么/我错过了什么?

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

所以,我终于找到了解决方案。

首先,我必须将父类中的类注释更新为以下内容:

/**
 * @Table(name="user")
 * @InheritanceType("SINGLE_TABLE")
 * @DiscriminatorMap({
 * "user" = "\mycode\folderB\User"
 * }) 
 */
class User

然后,我需要告诉我的cli-config.php每个实体从中生成模式。这对我来说是一个令人讨厌的部分,但最后,结果很重要。它按预期工作。 我的cli-config.php的结构看起来与此类似:

$loader = new Classloader(APP_ROOT."src/");
$loader->register();

$classLoader = new \Doctrine\Common\ClassLoader('path/to/mycode', APP_ROOT);
$classLoader->register();

$classLoader = new \Doctrine\Common\ClassLoader('DoctrineProxies', APP_ROOT);
$classLoader->register();

$config = new \Doctrine\ORM\Configuration();
$driverImpl = $config->newDefaultAnnotationDriver(array(
    APP_ROOT.'src/path/to/mycode'
));
$config->setMetadataDriverImpl($driverImpl);
$config->setQueryCacheImpl(new \Doctrine\Common\Cache\ApcCache());
$config->setMetadataCacheImpl(new \Doctrine\Common\Cache\ApcCache());
$config->setProxyDir(APP_ROOT.'src/path/to/Proxy');
$config->setProxyNamespace('DoctrineProxies');

$connectionOptions = array(
    'driver' => 'pdo_mysql',
    'dbname' => $dbname,
    'user' => $dbuser,
    'password' => $dbpass,
    'host' => $dbhost,
    'charset' => "UTF8"
);

$em = \Doctrine\ORM\EntityManager::create($connectionOptions, $config);

$helperSet = new \Symfony\Component\Console\Helper\HelperSet(array(
    'db' => new \Doctrine\DBAL\Tools\Console\Helper\ConnectionHelper($em->getConnection()),
    'em' => new \Doctrine\ORM\Tools\Console\Helper\EntityManagerHelper($em)
));

//here begins the solution :)

$tool = new \Doctrine\ORM\Tools\SchemaTool($em);
$classes = array(
    $em->getClassMetadata('mycode\folderA\User'),
    $em->getClassMetadata('mycode\folderB\User')
);
$tool->updateSchema($classes);
好吧,那就是它。它有点贵,但它创建了对实体中定义的表格的初步更新。

如果您遇到类似的问题,并且我的实体代码太抽象而无法传输到您的代码,请写信给我:)