不久前我问了一个类似的问题:使用数据映射器模式,实体(域对象)是否应该知道映射器?但是,它是通用的,我对如何使用 Doctrine2 专门完成一些事情非常感兴趣。
这是一个简单的示例模型:每个都Thing
可以有 a Vote
from a User
, aUser
可以转换多个,Vote
但只有最后一个才Vote
重要。因为其他数据(Msssage
等)与 相关,所以在放置Vote
第二个时,原始不能只是更新,它需要替换。Vote
Vote
目前Thing
有这个功能:
public function addVote($vote)
{
$vote->entity = $this;
}
并Vote
负责建立关系:
public function setThing(Model_Thing $thing)
{
$this->thing = $thing;
$thing->votes[] = $this;
}
在我看来,确保 a User
only has last Vote
counted 是Thing
应该确保的,而不是一些 service layer。
因此,为了将其保留在模型中,新Thing
功能:
public function addVote($vote)
{
foreach($this->votes as $v){
if($v->user === $vote->user){
//remove vote
}
}
$vote->entity = $this;
}
那么如何Vote
从域模型中删除呢?我应该放松Vote::setThing()
接受 aNULL
吗?我是否应该涉及某种Thing
可以用来删除投票的服务层?一旦选票开始累积,那foreach
将会很慢 - 是否应该使用服务层来允许Thing
搜索 aVote
而无需加载整个集合?
我肯定倾向于使用轻量级服务层;但是,有没有更好的方法来使用 Doctrine2 处理这种类型的事情,或者我是否朝着正确的方向前进?