我编写了一个非常庞大而复杂的查询,它在内部使用UNION从多个表中进行选择,然后返回一个混合类型实体的数组。
我知道Symfony的最佳实践说总是将查询放在存储库类中,但我该如何决定将它放入?它们之间没有父/子关系,这两个实体完全相同。
答案 0 :(得分:1)
我通常把它们放在我认为是上下文中最依赖的实体的存储库中。
例如,如果我有两个实体:User
和Group
许多实体可能与组具有拥有关系,但您不能指望Group
存储库单独提供每个特定依赖项运行所必需的方法。
依赖(拥有方)的责任是建立连接,而hense提供功能。
因此getUsersInGroup(Group $group)
之类的方法属于UserRepository
。
但是,您说您的两个实体之间没有直接关系 在这种情况下,我的第一条评论适用。使用其实体在查询上下文中更依赖于另一个的存储库。无论哪个实体,完全取决于你。
答案 1 :(得分:0)
不要使用存储库。存储库绑定到特定实体类型的上下文,它is supposed to be used as a Collection。
还有
<块引用>存储库在域和数据映射层之间中介,就像内存中的域对象集合。 (M.Fowler)
在您的情况下,我假设没有对象关系映射,因为您使用的是带有 UNION
表的查询。我假设您的查询不会返回实际的 Doctrine 实体,对吗?
在这种情况下,查询不属于 Repository 模式,我建议你有一个自定义类来封装大/复杂查询 PHP+SQL 代码,例如:
namespace App\Query
class MyComplexQuery {
(可选地实现 QueryInterface
)
并从您的 Controller
或 Service
调用它,而不从存储库传递。
如果您要定义自定义 Doctrine 实体来表示实体联合的结果,请使用此类实体的存储库。