[英]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.