我对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;
我已经尝试在子用户类中定义外键,但没有成功。
所以,我的问题是:我错过了什么/我错过了什么?
感谢您的帮助!
答案 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);
好吧,那就是它。它有点贵,但它创建了对实体中定义的表格的初步更新。
如果您遇到类似的问题,并且我的实体代码太抽象而无法传输到您的代码,请写信给我:)