繁体   English   中英

从Doctrine2存储库中获取关联实体集合作为数组

[英]Fetch associated entities collection from Doctrine2 repository as an array

我正在使用DDD方法开始一个小项目。 我已经在纯PHP中使用Entities和ValueObjects创建了域模型。 实体引用了它们的关联-在我的例子中,有一个Employee实体,其中包含他所属的Teams ,我将它们保留在Employee::teams属性中。 一切进展顺利,我已经为那些具有YAML中的关联的实体,在Symfony2和Doctrine2层中实现的存储库的接口等创建了映射。

当我从存储库(使用Doctrine的EntityManager::findAll() )而不是Team数组获取Employee ,我收到了这些团队的PersistentCollection 它基于PHP7构建,并且Employee::getTeams()具有array返回类型,因此我遇到了严重的异常。 是否可以通过某些外部侦听器(仅Symfony层,不要将其混入域文件)或其他任何核心机制将其转换为数组?

谢谢。

您得到ArrayCollection
http://www.doctrine-project.org/api/common/2.5/class-Doctrine.Common.Collections.ArrayCollection.html

它具有toArray()方法,因此您可以编写

/**
 * @return Team[]
 */
public function getTeams(): array
{
    return $this->teams->toArray();
}

但是我更喜欢

/**
 * @return Team[]|ArrayCollection
 */
public function getTeams()
{
    return $this->teams;
}

如果你使用好的IDE像PhpStorm它将正确理解它自动完成它像的ArrayCollection和Team ,如果你做foreach ($employee->getTeams() as $team) {...

ArrayCollection比普通数组更强大。 例如,您可以对其进行过滤和排序,Doctrine将生成优化的SQL,因此您不必加载所有项目
http://docs.doctrine-project.org/en/latest/reference/working-with-associations.html#filtering-collections

库巴

这似乎不是DDD问题,而是有关PHP实现细节的技术问题。 但是,请让我跳入您的设计并尝试为您的领域找到更好的解决方案。 您缺少建模员工与团队之间关系的模型,我们称其为团队中的员工。 您的工作方式是迫使一个AR引用另一个AR,这样员工可以管理团队的生命周期。 可能并非如此,但在特定情况下,另一个参与者可能会更改团队的状态,这可能会破坏员工对团队AR的不变性。 因此,当您使一个AR管理另一个AR生命周期时,就不应在存储库中找到这种依赖性,并且聚合的根现在可以迫使聚合AR保持不变。 仍然有一些需要提及的问题,但是为了简单起见,请继续对缺少的概念进行建模:EmployeeInTeam或任何您想调用的概念。 它引用了员工和团队的概念性身份,因此您将来可以安全地将其删除,可以查询团队中的员工以及该员工所在的团队。 如果您需要框架或数据库来保持一致性,那么您就无需执行DDD。 仅使用对象,而不是技术。

问候,塞巴斯蒂安。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM