Php 条令2 orm:模式工具:更新删除列
我对doctrine 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
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);
好了,就这样。这有点贵,但它会根据实体中的定义创建相应的更新表
如果您有类似的问题,并且我的实体代码过于抽象,无法转换为您的代码,请写信给我:)