2015-04-01 55 views
1

我遇到了特定于Doctrine ORM实体映射的问题,并覆盖了EkinoWordpressBundle中的供应商实体。我知道有一些功能可以覆盖包中的默认包实体。当我运行doctrine时:schema:update我得到了SchemaExceptions,像'table with name wp_users'已经存在。我试图弄清楚如何让一个实体的默认原则映射从包中被忽略以避免这个问题。symfony2原则捆绑实体覆盖/替换

我迄今所做的是:

  1. 创建实体,以取代从捆绑用户和UserMeta。
  2. 我定义ekino.wordpress.entity.user.class:MyBundleNamespace \ User和ekino.wordpress.entity.user_meta.class:在config.yml MyBundleNamespace \ UserMeta
  3. 我使用doctrine.orm.resolve_target_entities更换一起Ekino \ WordpressBundle \实体\ User和Ekino \ WordpressBundle \实体\ UserMeta关联引用的我自己

我不清楚定义新的实体管理器,以及如何,这将有助于缓解我的问题,如被建议软件包的开发者https://github.com/ekino/EkinoWordpressBundle/issues/71

另外我使用基于yml的映射defi以防对可能的解决方案产生影响。

回答

0

学说似乎很可能仍然认为Ekino'用户'仍然是一个实体,而不是仅仅使用你的。我不熟悉Ekino。如果它使用基于Annotation的配置,则可能必须创建自己的AnnotationDriver子类,并让它过滤掉不需要的Ekino类。

在ClassMetadata的低级代码中玩耍其实很有趣,但是在自己的危险中这样做。

0

我从一个帮助我了解维护人员建议的解决方案最初要求我做什么的伙伴那里得到了一些帮助。

所以在我的config.yml我有我的原则配置

doctrine: 
     orm: 
      ... 
      entity_managers: 
       default: 
        mappings: 
         MyCustomAppBundle: ~ 
       wordpress: 
        mappings: 
         EkinoWordpressBundle: ~ 

这解决了部分问题如下。我没有得到我正在获取的有关已存在表的SchemaExceptions。由于我只从包中取代了两个实体中的一些关联,这些关联不再位于原始实体的ClassMetadata中,所以我得到了有关缺少实体的其他错误,这些错误是通过将以下内容添加到doctrine:orm:配置定义中解决的:

resolve_target_entities: 
     Ekino\WordpressBundle\Entity\User: App\Bundle\MyCustomAppBundle\Entity\User 
     Ekino\WordpressBundle\Entity\UserMeta: App\Bundle\MyCustomAppBundle\Entity\UserMeta 

我最终通过定义独立的实体管理器来放弃原则自动映射,但我认为这是一个好的妥协。