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

时间:2016-04-23 12:19:36

标签: php symfony doctrine-orm domain-driven-design

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

当我从存储库(使用Doctrine的Employee)而不是EntityManager::findAll()数组中获取Team时,我会收到PersistentCollection这些团队。它基于PHP7构建,Employee::getTeams()的返回类型为array,所以我得到了关键的异常。 有没有办法将它转换为数组与一些外部侦听器(仅限Symfony层,以免混淆域文件)或任何其他核心机制?

感谢。

2 个答案:

答案 0 :(得分:0)

你得到了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;
}

如果您使用像PhpStorm这样的好IDE,它会正确理解它以像ArrayCollection一样自动填充它,如果你Team

那么它会foreach ($employee->getTeams() as $team) {...

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

答案 1 :(得分:0)

库巴,

这似乎不是DDD问题,而是关于PHP实现细节的技术问题。 但是,请让我跳转到您的设计,并尝试为您的域找到更好的解决方案。您缺少模拟员工与团队之间的关系,让我们称之为团队中的员工。你这样做的方式是强迫AR引用另一个AR,这就是员工管理团队生命周期的方式。情况可能并非如此,但在特定情况下,另一个参与者可能会更改团队的状态,这可能会破坏团队AR上的员工不变量。因此,当您创建AR以管理另一个AR生命周期时,不应通过存储库找到此依赖关系,并且聚合的根目前处于强制围绕聚合AR的不变的位置。 还有一些值得一提的问题,但为了保持简单,请继续为您缺少的概念建模:EmployeeInTeam或您想要的任何内容。它引用了员工和团队的概念身份,因此您可以在将来安全地删除它,您可以查询团队中的员工以及员工所属的团队。 如果您需要框架或数据库来保持一致性,那么您就不会使用DDD。仅使用对象,而不是技术。

此致 塞巴斯蒂安。