Php 最佳实践:如何在没有框架的情况下使用域模型实现多对多关系
各位好, 我正在使用纯PHP实现一个域模型。我有两个实体,实体Php 最佳实践:如何在没有框架的情况下使用域模型实现多对多关系,php,database,domain-driven-design,Php,Database,Domain Driven Design,各位好, 我正在使用纯PHP实现一个域模型。我有两个实体,实体狗和实体人,作为狗的主人 这是一种多对多的关系。一个所有者可以拥有多只狗,而一只狗被许多人(假设狗属于一个家庭或一对夫妇) 我有一个数据库表,用于dog和human以及n:n连接表。我有两个实体,它们是POPOs。我还有两个存储库,一个用于狗,一个用于人。这些存储库具有crud操作,并负责数据库查询 哪个存储库负责管理n:n表 例子: 实体dog有一个属性数组,其中包含所有连接的人,反之亦然。如果我创建了一个新的human,比如:$h
狗
和实体人
,作为狗的主人
这是一种多对多的关系。一个所有者
可以拥有多只狗
,而一只狗
被许多人
(假设狗属于一个家庭或一对夫妇)
我有一个数据库表,用于dog
和human
以及n:n连接表。我有两个实体,它们是POPOs。我还有两个存储库,一个用于狗,一个用于人。这些存储库具有crud操作,并负责数据库查询
哪个存储库负责管理n:n表
例子:
实体dog
有一个属性数组,其中包含所有连接的人,反之亦然。如果我创建了一个新的human
,比如:$human=newhuman('name')让他拥有一只已经存在的狗,比如:$human->addDog($dog)代码>谁负责n:n连接?
我可以做$dogRepo->Update($human->getDogs()[0])
更新数据库中的狗,或者我可以执行$humanRepo->Insert($human)
。DogRepo是否也应插入新的human
(利用HumanRepo)?HumanRepo是否也应更新狗
(利用DogRepo)。还是业务逻辑对此负责?(分别从业务逻辑中调用insertHuman()
和updateDog()
)。
在所有这些方法中,我不知道哪个存储库负责n:n表
听起来像是一个常见的问题,但我在网上找不到合适的解决方案
提前谢谢 这两个存储库只应更改其相应的表,因为这是它们的主要功能(遵循单一责任原则
)。这些存储库将由一个服务
(一个具有管理关系的实用功能的包装类)包装,该服务将负责正确地修改这两个数据库。因此,该服务可以有一个类似于assigndogtohman($humanId,$dogId)
的函数,该函数将调用两个存储库并相应地更改它们的数据
通过这样做,您可以确保存储库有一个责任(更新自己的表),而服务有责任管理狗
和人
之间的关系
这还为您提供了额外的好处,即存储库层现在是可替换的。也就是说,如果您决定更改数据库(例如从Mysql更改为MongoDB),则只需交换/更新存储库,因为assignDogToHuman
调用的函数的实现应该保持不变,对于此服务,底层数据库是什么并不重要
我希望这对您有所帮助,如果您有任何问题,请随时提问。在DDD中,我们根据业务规则设计聚合。每个聚合都保护自己的不变量。当我们设计它们时,头脑中没有表或关系表,只有不变量和一致性要求
也就是说,您遇到了一些困难,因为您没有识别不变量,或者没有不变量
养狗的人有什么特别的行为吗?如果人类没有/确实拥有狗,是否会拒绝某些人类命令?然后,您向Human
集合中添加一个拥有狗ID的列表(而不是狗实例!)
人类拥有的狗与没有主人的狗行为是否不同?然后将所有者ID列表添加到Dog
集合中
或者它们之间的这种关系只在UI中显示?然后将其添加为一个单独的聚合,即,DogOwnershipByAHuman(id,dogId,humanId)
,以避免污染狗
或人类
聚合他们不需要的数据