从现有表

时间:2016-01-16 18:44:23

标签: php mysql symfony doctrine-orm doctrine

我尝试从我的数据库的特定表中自动生成实体。我不想在整个数据库中发送学说,因为其中有些表与学说不兼容(比如遗留数据库中没有主键的表[是...])。

不幸的是,所有博客文章和SO-Anwers都没有帮助,因为参数" - 过滤"没有像预期的那样工作。

我做了什么:

我尝试了此SO-Answer的第一步,并阅读了此blog post

php app/console doctrine:mapping:convert metadata_format \
    ./src/App/UserBundle/Resources/config/doctrine \
    --from-database \
    --filter="user"

我将filter-argument理解为仅针对特定表进行过滤的解决方案。但是这个过滤器没有被应用。该过程被异常取消"表XYZ没有主键" (这里的确是正确的,不是问题的一部分)。

我想我可以创建一个完整的新数据库,而不会出现有问题的表来创建注释和实体。 但是我想知道关于这个过程的内容以及为什么它不起作用。

更新

我也尝试了第一个答案的建议:

php app/console doctrine:mapping:import --force AcmeBlogBundle yml

AcmeBlogBu​​ndle是我真正的捆绑包的占位符。然后导入任务将停止:

[Symfony的\元器件\调试\异常\ ContextErrorException]
  警告:class_parents():类操作不存在且无法加载

第一个表名为" action"。当我删除这个表时,它会在下一个表中以一个类似的异常停止。

更新2

该异常提到了上面的一些行,这些行是由于先前使用的ORM实现具有类似" ActionEntity.php"在名为" Entity"的目录中对于每个表。这就是我认为发生异常的原因。删除此目录后,异常消失了(但在我的情况下,它不是一个很好的解决方案)。

我现在做了什么:我丢弃了所有外键(他们制造了麻烦),我设置了一个全新的symfony项目,然后从第一个答案运行所有这些评论然后我得到了预先生成的实体类,但没有任何外键实现。我现在必须添加的东西,包括对数据库方案的一些更改,因为doctrine 2在这里有一些限制,比如不支持主键作为外键等等。 但现在我可以选择那些实体类并调整与其他实体的缺失连接。

总而言之:整个过程并不令人满意......

2 个答案:

答案 0 :(得分:3)

来自文档:

  

正如Doctrine工具文档所说,逆向工程是一个   开始一个项目的一次性过程。学说能够   转换大约70-80%的必要映射信息   基于字段,索引和外键约束。学说不能   发现反向关联,继承类型,实体   外键作为主键或关联的语义操作   例如级联或生命周期事件。一些额外的工作   之后需要生成的实体来设计每个实体以适应   您的域模型特性。

从数据库导入实体的正确步骤:

  1. php bin/console doctrine:mapping:import --force AcmeBlogBundle xml
  2. php bin/console doctrine:mapping:convert annotation ./src
  3. php bin/console doctrine:generate:entities AcmeBlogBundle
  4. 您可以使用 xml yml ,但对于我的情况,它仅适用于 xml

答案 1 :(得分:0)

我以编程方式使用命令, 这个读取config.yml文件中指示的数据库

# Doctrine Configuration
doctrine:
    dbal:
        default_connection: dbalYmlConfig
        connections:

命令是: -

       'command' => 'doctrine:mapping:convert',
       'to-type' => 'yml',
       'dest-path' => $rawOrmTempSavePath,
       '--from-database' => true,
       '--force' => true,

这将为每个数据库表模式创建x.orm.yml文件映射。

这将创建来自x.orm.yml的Entity文件,这些文件位于Resources / config / doctrine

       'command' => 'doctrine:generate:entities',
       'name' => 'MyBundle',

附注:我将x.orm.yml文件放在临时目录中,然后将它们复制到config / doctrine文件夹中,将包名称添加到x.orm.yml文件头中,但是您可以将文件直接转储到配置/教义。

Anyhoo这个方法适合我。