不久前我问了一个类似的问题:使用数据映射器模式,实体(域对象)是否应该知道映射器?但是,它是通用的,我对如何使用 Doctrine2 专门完成一些事情非常感兴趣。
这是一个简单的示例模型:每个都Thing可以有 a Votefrom a User, aUser可以转换多个,Vote但只有最后一个才Vote重要。因为其他数据(Msssage等)与 相关,所以在放置Vote第二个时,原始不能只是更新,它需要替换。VoteVote
目前Thing有这个功能:
public function addVote($vote)
{
$vote->entity = $this;
}
并Vote负责建立关系:
public function setThing(Model_Thing $thing)
{
$this->thing = $thing;
$thing->votes[] = $this;
}
在我看来,确保 a Useronly has last Votecounted 是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 处理这种类型的事情,或者我是否朝着正确的方向前进?