私の状況は次のとおりです:私はリファクタリングしようとしているアプリを開発しました。私はコントローラの中で基本的にはあまりにも多くのロジックを見つけましたDoctrine2エンティティ内で複雑なクエリを実行する方法は?
エンティティ内から実行できるようにしたい計算がいくつかあります。
たとえば、Transactionエンティティに関連するAccountというエンティティに関連するAgentというエンティティがあります。
ある時点では、エージェントに関連付けられたすべてのアカウント(特定の日付範囲内)からのすべてのトランザクションの合計を取得したいと思います。
私のようなメソッドを作成し、エージェントのリポジトリにコードをリファクタリングすることができた今のところ:それは正常に動作していると、それは方法が中にあった古いバージョンよりも優れている
AgentRepository::getTransactionSum(Agent $agent, \DateTimeImmutable $dateFrom, \DateTimeImmutable $dateTo)
Agent::getTransactionSum(\DateTimeImmutable $dateFrom, \DateTimeImmutable $dateTo) {
return $this->getRepository()->getTransactionSum($this, $dateFrom, $dateTo);
}
:
Agent::getTransactionSum(\DateTimeImmutable $dateFrom, \DateTimeImmutable $dateTo)
が、私はのようなものを使用して考えた:コントローラーは、私は次のように、エージェントにまっすぐにこの質問をできるようにしたいと思います
しかし、これは特に実用的でも望ましいことでもないので、このコードをどのように構造化すればよいですか?
おかげで
EDIT:行うことができる
ことの一つは、Agentクラスは、余分なSQLなしでそれを解決しましたさ。ような何か:
Agent::getTransactionSum(\DateTimeImmutable $dateFrom, \DateTimeImmutable $dateTo)
{
return array_sum(
array_map(
array_filter(
$this->getTransactions(), function (Transaction $t, $dateFrom, $dateTo) {
return $t->getDate() >= $dateFrom && $t->getDate() <= $dateTo;
}), function(Transaction $t) {
return $t->getAmount();
})
}
私は、これはビューのOOPの観点から、より純粋な実装になるだろう...それはおそらくはるかに効率的ではと思いますけれども推測...
あなたは、このようなカスタムメソッドを持つAgent' '実体を持っていると思いますなぜ?どのようなリポジトリが対象ですか?私はリポジトリ内で意味がある場所に置いておきます。エンティティ 'Agent'から直接呼び出す場合は、リポジトリをエンティティに結びつけるだけです。 – ReynierPM
@ReynierPMが言ったように、これはまさにリポジトリのためのものです。 – ccKep
@ReynierPMどのようにしてリポジトリをエンティティに結びつけるのですか?私はより良いOOPのためのエージェントの方法としてそれを持っていたいと思います(エージェントにそのようなメッセージを送るのが自然だと感じています...) – Muc