【问题标题】:Generating a single Entity from existing database using symfony2 and doctrine使用 symfony2 和教义从现有数据库生成单个实体
【发布时间】:2012-04-29 11:04:13
【问题描述】:

是否可以使用 Symfony2 控制台工具从数据库生成单个实体?

在编码过程中,我不得不添加一个表格,并对现有的实体类进行了修改。所以我不希望我的所有实体都重新生成。

任何建议将不胜感激!

【问题讨论】:

  • 许多人似乎仍然对包含没有主键的表的数据库存在问题 - '--filter' 仍然读取这些表,但失败了。使用教义.yaml 配置:doctrine.dbal.connections.CONNECTION_NAME.schema_filter: ~^(table_prefix_name_).*~ 或使用正则表达式跳过特定表

标签: php database symfony doctrine


【解决方案1】:

我遇到了同样的问题,你必须这样做:

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

然后

php app/console doctrine:mapping:import AppMyBundle \
    metadata_format --filter="Yourtablename"

metadata_format 是您要生成的文件结尾(例如 xml、yml、注释)

最后

php app/console doctrine:generate:entities AppMyBundle --no-backup

就像这个学说只会加载你需要的实体。请注意必须使用 CamelCase 的过滤器!

希望对你有帮助

【讨论】:

  • 我很高兴,我在这个问题上遇到了一些糟糕的事情。请注意过滤器,它非常“明智”,就像您设置 --filter="mytable" 学说将采用以“mytable”开头的所有表,而不仅仅是名为“mytable”的表(也有这个问题)。
  • @Coussinsky 这行得通,除了我有一个小问题:--filter=MyTable 不起作用。如果我删除该选项,我将获得数据库中的所有表,如果我添加该选项,我会得到:“没有要处理的元数据类。”,想法? stackoverflow.com/questions/13629959/…
  • 你忘记了“你必须这样写:--filter="MyTable"
  • whateveryouwant 是什么?
  • 如果数据库包含没有主键的表,这似乎不起作用,即使您的过滤器包含一个确实有主键的表。有什么想法吗?
【解决方案2】:

对于第三个命令,教义不断重新生成所有实体文件。通过在 bundle 后添加实体名称,它只生成了我感兴趣的实体。

php app/console doctrine:generate:entities AppMyBundle:Yourtablename --no-backup

【讨论】:

  • 它应该包含在最佳答案中,因为 Doctrine 重新生成了我所有的 ~300 个实体。
  • 实际上,如果我使用这个命令,我有Namespace "VENDOR\MyBundle\Entity\TableName" does not contain any mapped entities.,如果我使用完整的doctrine:generate:entities,它会重新生成我所有的实体,除了新的......我做错了什么?!
  • 这对我也不起作用。它从我所有的包中生成实体。
  • “无法打开输入文件:app/console”
  • @Dennis 确保您位于项目的根目录中。执行 ls/dir 命令时应该有一个“app”目录。
【解决方案3】:

Symfony 2.7 选项注释和 [/xml/yml] 的简单工作解决方案参见 http://symfony.com/doc/current/cookbook/doctrine/reverse_engineering.html

分 3 步执行 3 个命令:

$ php app/console doctrine:mapping:import --force AppBundle xml --filter="Meeting"

(注意:如果您的数据库名称是my_meeting,您需要在filter="MyMeeting" 中将其更改为MyMeeting,以便于doctual 找到您的表名。这是因为doctrine 总是会剥离下划线并将 Camel-case 添加到您的表名。如果没有,您将收到此错误:“数据库没有任何映射信息”。)

$ php app/console doctrine:mapping:convert annotation ./src/AppBundle/Entity --from-database --filter="Meeting"

(注意: 确保您的 Meeting.php 类文件中有namespace AppBundle\Entity;,如下所示:

<?php
/**
* Created by PhpStorm.
* User:
* Date: 03-Sep-2015
* Time: 3:23 PM
*/
namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

如果不添加。)

地点:

  • AppBundle 正是 Symfony 2.7 中的“AppBundle”
  • Meeting 是目标表(区分大小写)

为了确定,请检查此目录:

src\AppBundle/Resources/config/doctrine/Meeting.orm.xml

并确保您只有要创建实体类文件的表的 .xml 文件,而没有其他文件。然后运行以下命令为您之前创建的实体类生成 get 和 set 方法

$ php app/console 原则:generate:entities AppBundle:Meeting --no-backup

注意2: 作为最后一步,您必须删除例如 src\AppBundle/Resources/config/doctrine/VisitorData.orm.xml 中的 xml 学说 orm db 文件

对我来说效果很好。

解释请阅读:http://symfony.com/doc/current/cookbook/doctrine/reverse_engineering.html

【讨论】:

    【解决方案4】:

    @fyrye 当前隐藏的评论值得称赞,想添加它,以免被其他人错过。这是方法:

    /** @var \Doctrine\DBAL\Connection $connection */
    $config = $connection->getConfiguration();
    
    // for excluding an specific table
    $config->setFilterSchemaAssetsExpression('/^(table_to_reverse_engineer_1|table_to_reverse_engineer_2).*$/');
    

    来源:https://coderwall.com/p/jofhdw/doctrine-tell-which-tables-to-work-with

    由于大量定义错误的旧表,我在运行以下命令时遇到问题

    php ./vendor/bin/doctrine orm:convert-mapping --force --from-database annotation ./src/UI/Entity/
    

    事实证明,--filter 标志仅在它从所有表中读取元数据后进行过滤,如果它们没有主键或有其他问题,将导致命令失败

    【讨论】:

    • 您在哪里添加setFilterSchemaAssetsExpression() 电话?您是否正在修改核心 Symfony 或 Doctrine 文件?
    • 好问题,我真的不记得了!我认为 ./vendor/bin/doctrine 文件使用了一个引导文件或名为 cli-config.php 的文件 - 请参阅 doctrine-orm.readthedocs.org/en/latest/reference/… 有帮助吗?
    • @mHouses in Symfony2.3+ 更容易编辑您的app/config/config.yml 以包含调用setFilterSchemaAssetsExpressionschema_filter 选项,请参阅:symfony.com/doc/current/reference/configuration/doctrine.html
    • doctrine: dbal: connections: user_db: schema_filter: /^(oauth_)/
    【解决方案5】:

    对于使用 Symfony 3 的我来说,没有一个答案是完全正确的。我最终做了:

    php bin/console doctrine:mapping:import --force MyBundle xml --filter="MyTable"
    
    php bin/console doctrine:mapping:convert annotation ./src --filter="MyTable"
    
    php bin/console doctrine:generate:entities MyBundle:MyTable --path ./src
    

    【讨论】:

      【解决方案6】:

      我会将此作为对已接受答案的评论,但我是新手。

      对于像我这样在使用 --filter 开关映射多个名称中包含重合字符串的表时遇到问题的人,可以使用一种模式。

      示例表名:

      供应商 供应商联系方式

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

      该命令将转换两个表,而不仅仅是 Vendor。如果您只想要 Vendor 而不是 VendorContact,请在 --filter 中使用模式:

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

      希望对某人有所帮助!

      【讨论】:

      • 这是我一直在寻找的答案。我错过了反斜杠 b!
      【解决方案7】:

      也适用于 Symfony 3。

      如果您收到“没有要处理的元数据类”。消息尝试在过滤器参数中将您的表名转换为 Doctrine 驼峰大小写。

      “my_table_name”需要写成“MyTableName”。

      【讨论】:

      • 没错!第一次尝试时出现错误,但是当我以驼峰式风格写实体名称时,一切正常。
      【解决方案8】:

      --filter 使用实体名称,而不是表名称! php bin/console 原则:mapping:import "App\Entity" 注解 --path=config/doctrine --filter="YourEntity"

      【讨论】:

        【解决方案9】:

        对于 Symfony 3

        为新的“组”表生成实体

        php bin/console doctrine:mapping:import "App\Entity" annotation --path=src/AppBundle/Entity --filter Group
        

        symfony 3 documentation中所写

        【讨论】:

          【解决方案10】:

          我在 Symfony 2.4 和 MySQL 上遇到了完全相同的问题。

          上面发布的解决方法都不适合我。

          我最终用我想要提取的表创建了一个新数据库(这很容易做到,因为 MySQL 提供了创建脚本)。

          然后更改与该新数据库的连接并从那里执行实体提取命令。

          似乎有点激进,但我不会手动创建实体。

          希望有帮助

          【讨论】:

            【解决方案11】:

            在我的 symfony 3.3 中这些都不起作用。所以我只是创建了一个目录副本并重新生成了副本目录中的所有实体。然后我在原始目录中复制了所需的实体。

            --由于这个问题,过滤器不起作用https://github.com/symfony/symfony/issues/7717

            【讨论】:

            • 正如标题所示,这个问题是专门针对 symfony2 的
            • @Sethunath。 .我同意。 .这就是我提到版本的原因。 .它可能对像我这样的人有所帮助,因为没有其他用户要求此版本。
            • 当然!感谢您的回答
            猜你喜欢
            • 2012-04-07
            • 1970-01-01
            • 2013-01-02
            • 2013-03-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-02-04
            • 1970-01-01
            相关资源
            最近更新 更多