我正在通过\Doctrine\ORM\Tools\DisconnectedClassMetadataFactory()
类从数据库创建实体。这很完美!命名空间生成除外。没有生成名称空间。我将我的实体存储在App/Model/Entities
。
这是我用来生成实体的代码:
<?php
$em->getConfiguration()->setMetadataDriverImpl(
new \Doctrine\ORM\Mapping\Driver\DatabaseDriver(
$em->getConnection()->getSchemaManager()
)
);
$cmf = new \Doctrine\ORM\Tools\DisconnectedClassMetadataFactory();
$cmf->setEntityManager($em);
$metadata = $cmf->getAllMetadata();
// GENERATE PHP ENTITIES!
$entityGenerator = new \Doctrine\ORM\Tools\EntityGenerator();
$entityGenerator->setGenerateAnnotations(true);
$entityGenerator->setGenerateStubMethods(true);
$entityGenerator->setRegenerateEntityIfExists(false);
$entityGenerator->setUpdateEntityIfExists(true);
$entityGenerator->generate($metadata, __dir__. '/Model/Entities");
答案 0 :(得分:9)
我认为,更好的方法是将命名空间直接设置为驱动程序
<?php
$driver = new \Doctrine\ORM\Mapping\Driver\DatabaseDriver($em->getConnection()->getSchemaManager());
$driver->setNamespace('App\\Model\\Entities\\');
$em->getConfiguration()->setMetadataDriverImpl($driver);
....
答案 1 :(得分:4)
我不认为您可以在从数据库导入时设置命名空间,因为EntityGenerator从元数据中获取命名空间信息。数据库没有或不需要名称空间,因此信息不会自动来自那里。
您可以尝试循环遍历$ metadata对象并自己将名称空间添加到类名。 EntityGenerator中用于检索命名空间的代码非常简单:
private function _getNamespace(ClassMetadataInfo $metadata)
{
return substr($metadata->name, 0, strrpos($metadata->name, '\\'));
}
如果所有其他方法都失败了,您始终可以实现自己的EntityGenerator,您可以提供要使用的命名空间。我们在我们的大型项目中做到了这一点,在这个项目中,在生成过程中还有其他一些自定义任但是,EntityGenerator不容易被覆盖,有很多私有方法和属性,所以你可能需要复制和粘贴整个东西。
答案 2 :(得分:-3)
您可以使用此PHP脚本从数据库表生成实体。 此脚本将一个示例命名空间添加到生成的文件中,因此您可以设置命名空间。 https://gist.github.com/SamvelG/3b39622844f23cac7e76#file-doctrine-entity-generator-php