【问题标题】:How to generate entities from database view with doctrine and symfony2如何使用教义和 symfony2 从数据库视图生成实体
【发布时间】:2012-04-07 16:35:43
【问题描述】:

我正在尝试使用标准控制台命令从数据库生成实体,如 Symfony2 文档中所述:http://symfony.com/doc/current/cookbook/doctrine/reverse_engineering.html

php app/console doctrine:mapping:convert --from-database --force yml "src/My/HomeBundle/Resources/config/doctrine/metadata/orm"
php app/console doctrine:mapping:import MyHomeBundle yml
php app/console doctrine:generate:entities MyHomeBundle

在此之后,所有表都正确生成。问题是这不会为数据库视图生成实体。例如,当我自己将 yml 文件添加到 src/My/HomeBundle/Resources/config/doctrine/metadata/orm 中时:

UserInGroup:
  type: entity
  table: user_in_group_view
  fields:
    id:
      id: true
      type: integer
      unsigned: false
      nullable: false
      generator:
        strategy: IDENTITY
    userId:
      type: integer
      unsigned: false
      nullable: false
      column: user_id
    userGroupId:
      type: integer
      unsigned: false
      nullable: false
      column: user_group_id
  lifecycleCallbacks: {  }

运行php app/console doctrine:generate:entities MyHomeBundle时出现此异常:

Notice: Undefined index: My\HomeBundle\Entity\UserInGroup in C:\Users\ThisIsMe\Projects\SymfonyTestProject\vendor\doctrine\lib\Doctrine\ORM\Mapping\Driver\AbstractFileDriver.php line 121

在这里发布了类似的问题:How to set up entity (doctrine) for database view in Symfony 2

我知道我可以创建实体类,但我希望我可以生成它,所以如果我改变我的观点,我可以重新生成实体类。有什么建议吗?

【问题讨论】:

    标签: symfony doctrine-orm


    【解决方案1】:

    现在您只创建您的 orm 文件。您需要再执行 2 个步骤。我会从头给你完整的步骤。

    在执行此操作之前,请删除您之前创建的 orm 目录中的所有 yml 文件。

    我希望 MyHomeBundle 是您的捆绑包名称

    1).php app/console doctrine:mapping:convert yml ./src/My/HomeBundle/Resources/config/doctrine --from-database --force 
    
      Symfony2 generate entity from Database
    
     2).php app/console doctrine:mapping:import MyHomeBundle yml
    
     3).php app/console doctrine:generate:entities MyHomeBundle
    

    希望对你有所帮助。

    【讨论】:

    • 这些是我在问题中描述的相同步骤,这会为所有表生成实体,而不是为视图生成实体。不同之处在于生成的 yml 文件的目标路径。我已经尝试过您的解决方案以防万一,但它不能解决问题,只有表变成了实体。我知道早期版本的 Doctrine(和 Symfony)可以毫无问题地从视图中生成实体。
    【解决方案2】:

    遇到同样的问题,我使用 xml 而不是 yml 但必须相同。

    如果名称包含正确的路线,请检查您的 orm 实体,例如:

    <entity name="Myapp\MyrBundle\Entity\MyEntity" table="myentity">
    

    因为当我从数据库生成我的 orm 时,名称是这样的:

    <entity name="MyEntity" table="myentity">
    

    所以教义没有理解正确的道路。

    希望我很清楚,这会对你有所帮助!

    【讨论】:

    • 已检查。我想到了这一点,并尝试了不同的组合,但没有任何运气。不过还是谢谢。
    • 你能通过实体 UserInGroup 吗?
    • 问题是我不想自己创建实体,而是让 Doctrine 为我做这件事。最后,我创建了实体并正在使用它,但问题仍然存在。
    • 好的,但问题是如果您执行了学说:映射:导入,您的实体文件夹中应该有实体。 generate:entities 只是生成实体的 getter 和 setter,所以实体的命名空间或类名可能是错误的(这可以解释你的错误),但如果你设法得到你的实体,那就太好了。
    • 没错!但他们不在那里,这就是问题和我的问题。请注意,数据库表的实体已正确生成 - 问题出在数据库视图上。
    【解决方案3】:

    正如您在此处看到的: http://symfony.com/doc/current/cookbook/doctrine/reverse_engineering.html 从 db 到 entity 的逆向工程过程还没有完全实现:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-17
      • 2013-10-30
      相关资源
      最近更新 更多