Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/230.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 最佳实践:如何在没有框架的情况下使用域模型实现多对多关系_Php_Database_Domain Driven Design - Fatal编程技术网

Php 最佳实践:如何在没有框架的情况下使用域模型实现多对多关系

Php 最佳实践:如何在没有框架的情况下使用域模型实现多对多关系,php,database,domain-driven-design,Php,Database,Domain Driven Design,各位好, 我正在使用纯PHP实现一个域模型。我有两个实体,实体狗和实体人,作为狗的主人 这是一种多对多的关系。一个所有者可以拥有多只狗,而一只狗被许多人(假设狗属于一个家庭或一对夫妇) 我有一个数据库表,用于dog和human以及n:n连接表。我有两个实体,它们是POPOs。我还有两个存储库,一个用于狗,一个用于人。这些存储库具有crud操作,并负责数据库查询 哪个存储库负责管理n:n表 例子: 实体dog有一个属性数组,其中包含所有连接的人,反之亦然。如果我创建了一个新的human,比如:$h

各位好,

我正在使用纯PHP实现一个域模型。我有两个实体,实体
和实体
,作为狗的主人

这是一种多对多的关系。一个
所有者
可以拥有多只
,而一只
被许多
(假设狗属于一个家庭或一对夫妇)

我有一个数据库表,用于
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)
,以避免污染
人类
聚合他们不需要的数据