2014-01-25 59 views
0

我在我的一个可移植包中使用MappedSuperClass设置了一个实体。我将它扩展到每个独立项目/网站的实体,并在主项目包中实现附加属性。我正在使用接口和ResolveTargetEntities来使用接口关联实体。这部分至今工作完美无瑕。Doctrine DQL与接口

问题出现在我的DQL查询中,这些查询需要解决特定实现的实体类(扩展映射超类的实体类)。如果我使用接口或映射的超类,我会得到Symfony错误。但我不想使用我的超类名称实现,因为这意味着我必须更改每个项目的可移植包的存储库代码,这是不可接受的。

其中一个想法是从存储库中的config获取orm映射,并在那里注入正确的类。但我找不到从配置文件中提取该信息的方式。

另一方面,更好的方法是创建某种类型的监听器,它将为我替换真实的界面。

所以我的问题:有谁知道这是否是通常的行为,DQL不能解决?有没有人有任何想法我将如何实现代码来实现自己的决议?

任何信息表示赞赏。

回答

0

我假设你已经将你的具体类设置为你稍后在父包中访问的参数。如果是这样,您可以为该类创建一个存储库(从Sylius复制一半)。

parameters: 
    acme.repository.something.class: Doctrine\ORM\EntityRepository 
    // Or your custom repository 

services: 
    acme.manager.something: 
     alias: doctrine.orm.entity_manager 

    acme.metadata.something: 
     class: Doctrine\ORM\Mapping\ClassMetadata 
     factory_service: acme.manager.something 
     factory_method: getClassMetadata 
     arguments: 
      - %acme.model.something.class% 

    acme.repository.something: 
     class: %acme.repository.something.class% 
     arguments: 
      - @acme.manager.something 
      - @acme.metadata.something 

然后,你可以调用使用$this->container->get('acme.repository.something)仓库`

+0

感谢您的回复。这并不是说我无法访问我的存储库,我已经在做你正在提出的建议。问题是,我有一个DQL查询从另一个实体获取数据,而不是Repository引用的数据。所以在我的DQL中,我有这样的东西:'SELECT gl,g,c,cl,m,ml FROM Path \ Which \ Should \ Be \ an \ Interface gl'。接口应该被映射到正确的实体。这甚至有可能吗? –

0

安德烈,我有一个类似的情况。您可以在自定义存储库中设置一个setter方法来设置要在dql中使用的类名称。然后,您可以在服务声明中使用call标记调用该setter方法。

这是我在我的后回购服务声明中所做的。我希望它有帮助。祝你好运。

<service id="cfs_blog.post_repository" 
     class="%cfs_blog.post_repository.class%" 
     factory-service="doctrine.orm.entity_manager" 
     factory-method="getRepository"> 
     <argument>%cfs_blog.post.class%</argument> 
     <call method="setUserEntityClass"> 
      <argument>%user_class%</argument> 
     </call> 
    </service>