0

我正在尝试导入数据库以使用 Doctrine 启动 ZF3 PHP 项目。

我已阅读本教程,了解如何从数据库创建实体并发出以下命令:

$ cd myproject
$ ./vendor/bin/doctrine-module mapping:import

并得到这个错误:

[Symfony\Component\Console\Exception\CommandNotFoundException]
There are no commands defined in the "mapping" namespace.

The command:

$ ./vendor/bin/doctrine-module list

列出可用的命令。只有orm:和列出,根本没有migration:命令。dbal:mapping:

我在这里错过了一些安装阶段吗?

4

1 回答 1

1

你没有错过:mapping,因为 Doctrine Tools 中没有映射命令。Doctrine Symfony Bundle 可能会生成自己的命令并将其转发给 Doctrine Tools 中的另一个命令。(有一些 Symfony 知识的人可以确认?)。至于ZF usingphp /vendor/bin/doctrine-module list列出了所有 Doctrine Tool 命令。你应该看看Doctrine ORM Tools

如文档中所述,您可能应该使用Reverse engineering。正如我所了解的那样,您想从现有数据库创建模型/实体。

但在将您的数据库逆向工程为模型之前,您应该考虑 Doctrine 所述的以下内容:

逆向工程是一个一次性的过程,可以让你开始一个项目。将现有的数据库模式转换为映射文件只能检测到大约 70-80% 的必要映射信息。此外,现有数据库的检测无法检测反向关联、继承类型、具有外键作为主键的实体以及对关联的许多语义操作,例如级联。

请注意以下事项,因为这可能很重要,因为您必须检查已创建的内容并在需要时进行更正。

根据特殊情况,逆向工程并不总是完美地工作。它只会检测多对一关系(即使它们是一对一的),并会尝试从多对多表创建实体。它还存在命名具有多个列名的外键的问题。任何逆向工程数据库模式都需要大量的手动工作才能成为有用的域模型。

并且不要使用 Symfony 3 文档来帮助您与 Doctrine 的 Zend Framework 集成,因为两者都有自己的方式(Bundles vs Modules)。当然 Symfony Bundle 或 Zend 模块中的某些东西是匹配的,但这只是基于 Doctrine 本身提供的工具。

由于评论而编辑

正如评论中所述,目前还不清楚哪个命令取代了 Symfony 命令:$ php bin/console doctrine:mapping:import --force AcmeBlogBundle xml. 在您的 ZF2/3 应用程序中,您没有此功能可以在 Doctrine (ORM) 模块中立即为您生成映射。与 Symfony 中一样,您可以指定要为其生成实体的 Bundle。这是 Symfony 中构建的特定内容。为了模仿这一点,您需要在 Zend Framework 应用程序中自己完成。

在您的 ZF 应用程序中,您必须创建自己的任务来执行此操作,因此您必须在可以访问 EntityManager 的地方创建此作业。

    /** @var \Doctrine\Orm\EntityManager $em */
    $em = $this->getEntityManager();
    $em->getConfiguration()->setMetadataDriverImpl(
        new \Doctrine\ORM\Mapping\Driver\DatabaseDriver(
            $em->getConnection()->getSchemaManager()
        )
    );

    $cmf = new \Doctrine\Orm\Tools\DisconnectedClassMetadataFactory();
    $cmf->setEntityManager($em);
    $metadata = $cmf->getAllMetadata();

    $cme = new \Doctrine\Orm\Tools\Export\ClassMetadataExporter();
    //$_exporterDrivers = array(
    //    'xml' => 'Doctrine\ORM\Tools\Export\Driver\XmlExporter',
    //    'yaml' => 'Doctrine\ORM\Tools\Export\Driver\YamlExporter',
    //    'yml' => 'Doctrine\ORM\Tools\Export\Driver\YamlExporter',
    //    'php' => 'Doctrine\ORM\Tools\Export\Driver\PhpExporter',
    //    'annotation' => 'Doctrine\ORM\Tools\Export\Driver\AnnotationExporter'
    //);
    $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(\Zend\Mvc\MvcEvent $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
于 2016-11-25T09:13:11.833 回答