你好 stackoverflow 成员,
我正在使用纯 PHP 来实现域模型。我有两个实体,实体 dog
和实体 human
作为狗的主人。
这是一个多对多的关系。一个 owner
可以拥有不止一只 dog
而 dog
由许多 human
拥有(假设这只狗属于给一个家庭或一对夫妇)。
我有一个dog
和human
的数据库表,还有n:n 连接表。我有两个实体,它们是 POPO。我还有两个存储库,一个用于 dog
,一个用于 human
。这些存储库具有 CRUD 操作,并负责数据库查询。
哪个存储库负责管理 n:n 表?
示例:
实体 dog
有一个包含所有连接的 human
的属性数组,反之亦然。如果我创建一个新的 human
,例如:$human = new Human('name');
并让他拥有一条已经存在的 dog
,例如: $human->addDog($dog);
谁负责 n:n 连接?
我可以执行 $dogRepo->Update($human->getDogs()[0]);
来更新数据库中的狗,或者我可以执行 $humanRepo->Insert($human)
。 DogRepo 是否也应该插入新的 human
(利用 HumanRepo)? HumanRepo 是否也应该更新 dog
(利用 DogRepo)。还是业务逻辑对此负责? (从业务逻辑中分别调用 insertHuman()
和 updateDog()
)。
在所有这些方法中,我不知道哪个存储库负责 n:n 表?
听起来像是一个常见问题,但我在网上找不到合适的解决方案。
提前致谢!
最佳答案
在 DDD 中,我们根据业务规则设计聚合。每个聚合都保护自己的不变量。我们设计的时候脑子里没有表或者关系表,只有不变量和一致性要求。
话虽如此,您遇到困难是因为您没有确定不变量或根本没有。
养狗的人是否有某种特定的行为方式?如果人类不拥有/确实拥有狗,是否会拒绝某些人类命令?然后添加到 Human
聚合拥有的狗 ID 列表(而不是狗实例!)。
人类拥有的狗与没有主人的狗的行为是否不同?然后向 Dog
聚合所有者 ID 列表。
或者它们之间的这种关系仅显示在用户界面中?然后将其添加为单独的聚合,即 DogOwnershipByAHuman(id, dogId, humanId)
不污染 Dog
或 Human
聚合数据不需要。
关于php - 最佳实践 : how to implement many-to-many relations using Domain Models without framework,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53408757/