Php 条令2 orm:模式工具:更新删除列

Php 条令2 orm:模式工具:更新删除列,php,mysql,orm,doctrine-orm,doctrine,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 */ protect

我对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
}
运行orm:schema工具:update--dump sql可以很好地工作,它创建一个包含所有已定义列的表,并将$role设置为带索引的外键。一切都好

现在我尝试为一个特殊情况添加一些特殊字段,以便从我的用户类继承。代码如下所示:

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
}
当我现在运行orm:schema tool:update--dump sql时,它显示了添加列“special”,但也显示了以下内容:

DROP INDEX role ON user;
ALTER TABLE user DROP role_id;
/**
 * @Table(name="user")
 * @InheritanceType("SINGLE_TABLE")
 * @DiscriminatorMap({
 * "user" = "\mycode\folderB\User"
 * }) 
 */
class User
我已经尝试在子用户类中定义外键,但是没有成功

所以,我的问题是:我遗漏了什么/我误解了什么


谢谢你的帮助

所以,我终于找到了解决办法

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

DROP INDEX role ON user;
ALTER TABLE user DROP role_id;
/**
 * @Table(name="user")
 * @InheritanceType("SINGLE_TABLE")
 * @DiscriminatorMap({
 * "user" = "\mycode\folderB\User"
 * }) 
 */
class User
然后,我需要告诉我的cli-config.php要从中生成模式的每个实体。这对我来说是一个注释部分,但最后,结果很重要。它的工作原理与预期一致。 my 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);
好了,就这样。这有点贵,但它会根据实体中的定义创建相应的更新表

如果您有类似的问题,并且我的实体代码过于抽象,无法转换为您的代码,请写信给我:)