在Symfony2中放置使用多个实体的Doctrine查询的位置


Where to put Doctrine queries that use multiple entities in Symfony2?

我编写了一个相当大而复杂的查询,该查询在内部使用 UNION 从多个表中进行选择,然后返回混合类型实体数组。

我知道Symfony的最佳实践是始终将查询放在存储库类中,但是我如何决定将其放入哪个?它们之间没有父子关系,两个实体是完全平等的。

我通常将它们放在我认为上下文中最依赖的实体的存储库中。

例如,如果我有两个实体:UserGroup .
许多实体可能与组有拥有关系,但您不能指望Group存储库单枪匹马地提供每个特定依赖项运行所需的方法。

依赖方(拥有方(有责任建立连接,而 hense 提供功能。

所以像getUsersInGroup(Group $group)这样的方法属于UserRepository

但是,您说你们的两个实体之间没有直接关系。
在这种情况下,我的第一条评论适用。 在查询上下文中使用其实体更依赖于另一个的存储库。 无论哪个实体,都完全取决于你。

不要使用存储库。存储库绑定到特定实体类型的上下文,并且应该用作集合。

存储库在域

和数据映射层之间进行调解,其作用类似于内存中的域对象集合。(M.福勒(

在您的情况下,我假设没有对象关系映射,因为您使用的是带有UNION表的查询。我假设您的查询不会返回实际的教义实体,对吧?

在这种情况下,查询

不属于存储库模式,我建议您有一个自定义类来封装大型/复杂查询 PHP+SQL 代码,例如:

namespace App'Query
class MyComplexQuery {

(可选地实现QueryInterface(

并从您的ControllerService调用它,而无需从存储库传递。

<小时 />

如果您要定义自定义原则实体来表示实体联盟的结果,请使用该实体的存储库。