我正在尝试导入数据库以使用学说启动ZF3 PHP项目。
我已经阅读了有关如何从数据库创建实体并发出以下命令的教程:
$ cd myproject
$ ./vendor/bin/doctrine-module mapping:import
遇到此错误:
[SymfonyComponentConsoleExceptionCommandNotFoundException]
There are no commands defined in the "mapping" namespace.
The command:
$ ./vendor/bin/doctrine-module list
列出可用命令。仅列出orm:
,migration:
和dbal:
,根本没有mapping:
命令。
我在这里错过了某个安装阶段吗?
您不会缺少:mapping
,因为学说工具中没有映射命令。学说Symfony束概率提出了自己的命令,并将其转发到学说工具中的另一个命令中。(一些具有一些同类知识可以确认的人?)。至于 ZF 使用php /vendor/bin/doctrine-module list
列出了所有学说工具命令。您应该看一下学说ORM工具。
如文档中所述,您应该使用反向工程。正如我所知,您想从现有数据库创建模型/实体。
但是,在将数据库进行逆向工程之前,您应该考虑以下内容:
逆向工程是一个一次性过程,可以使您从项目开始。将现有数据库模式转换为映射文件,仅检测约70-80%的必要映射信息。此外,从现有数据库中的检测无法检测逆关联,继承类型,以外键为主要键的实体以及许多关于级联关联的语义操作。
。
并注意以下内容,因为这可能很重要,因为您必须检查已创建的内容并在需要时进行更正。
逆向工程并不总是根据特殊情况完美地工作。它只会检测多一对一的关系(即使它们是一对一的关系),并将尝试从多到许多表中创建实体。它还存在具有多个列名称的外国钥匙的命名问题。任何反向工程的数据库 - 施加机构都需要大量的手动工作才能成为有用的域模型。
,并且不要使用Symfony 3文档来帮助您进行Zend Framework的学说集成,因为两者都有自己的方式(捆绑关系与模块)。当然,Symfony Bundle或Zend模块中的某些内容是匹配的,但这仅基于Doctrine Itsself提供的工具。
由于评论而编辑
如注释中所述,尚不清楚哪个命令替换Symfony命令:$ php bin/console doctrine:mapping:import --force AcmeBlogBundle xml
。在您的ZF2/3应用程序中,您没有此功能可以在学说(ORM)模块中立即为您生成映射。与Symfony一样,您可以指定要生成实体的捆绑包。这是在Symfony中构建的特定事物。为了模仿这是您自己在Zend Framework应用程序中自己做的。
在您的ZF应用程序中,您已经创建了自己的任务来执行此操作,因此您可以在可以访问EntityManager的某些东西上创建此作业。
/** @var DoctrineOrmEntityManager $em */
$em = $this->getEntityManager();
$em->getConfiguration()->setMetadataDriverImpl(
new DoctrineORMMappingDriverDatabaseDriver(
$em->getConnection()->getSchemaManager()
)
);
$cmf = new DoctrineOrmToolsDisconnectedClassMetadataFactory();
$cmf->setEntityManager($em);
$metadata = $cmf->getAllMetadata();
$cme = new DoctrineOrmToolsExportClassMetadataExporter();
//$_exporterDrivers = array(
// 'xml' => 'DoctrineORMToolsExportDriverXmlExporter',
// 'yaml' => 'DoctrineORMToolsExportDriverYamlExporter',
// 'yml' => 'DoctrineORMToolsExportDriverYamlExporter',
// 'php' => 'DoctrineORMToolsExportDriverPhpExporter',
// 'annotation' => 'DoctrineORMToolsExportDriverAnnotationExporter'
//);
$exporter = $cme->getExporter('xml', '/path/to/export/xml');
$exporter->setMetadata($metadata);
$exporter->export();
例如,在您的应用程序模块中的Module.php
中。添加此方法:public function onBootstrap(MvcEvent $event)
class Module
{
public function onBootstrap(ZendMvcMvcEvent $event)
{
$entityManager = $event->getApplication()->getServiceManager()->get('doctrine.entitymanager.orm_default');
// code block above
// remove this code when export is done
}
}
现在,我们已经在XML文件或您指定的文件类型中使用了您的元数据,您可以使用以下命令来创建实体:
$ php doctrine orm:convert-mapping --from-database xml /path/to/mapping-path-converted-to-xml
学说模块用户:
$ php /vendor/bin/doctrine-module orm:convert-mapping --from-database xml /path/to/mapping-path-converted-to-xml