しばらく前に同様の質問をしました:データ マッパー パターンを使用して、エンティティ (ドメイン オブジェクト) はマッパーについて知っている必要がありますか? しかし、それは一般的なものであり、具体的に Doctrine2 でいくつかのことを達成する方法に本当に興味があります。
以下は単純なモデルの例です: それぞれThing
がVote
from aUser
を持つことができ、 aUser
は複数のキャストを行うことができますが、最後のカウントVote
のみをキャストすることができます。Vote
他のデータ (Msssage
など) は に関連しているためVote
、2 番目Vote
が配置されると、元のデータVote
を更新するだけでなく、置き換える必要があります。
現在Thing
、この機能があります:
public function addVote($vote)
{
$vote->entity = $this;
}
そしてVote
、関係の設定を処理します:
public function setThing(Model_Thing $thing)
{
$this->thing = $thing;
$thing->votes[] = $this;
}
aUser
が最後にVote
カウントされたものだけであることを保証することは、Thing
保証すべきものであり、一部のサービスレイヤーではないように思えます。
したがって、それをモデルに保持するために、新しいThing
関数:
public function addVote($vote)
{
foreach($this->votes as $v){
if($v->user === $vote->user){
//remove vote
}
}
$vote->entity = $this;
}
Vote
では、ドメイン モデル内からを削除するにはどうすればよいでしょうか。リラックスVote::setThing()
して受け入れる必要がありNULL
ますか?Thing
投票を削除するために使用できるある種のサービスレイヤーを含める必要がありますか? 投票が蓄積し始めると、それforeach
は遅くなるでしょう - サービス層を使用して、コレクション全体をロードすることなくThing
検索できるようにする必要がありますか?Vote
私は間違いなくライト サービス レイヤーの使用に傾いています。しかし、Doctrine2 でこの種のことを処理するより良い方法はありますか、それとも正しい方向に向かっていますか?