2017-10-12 11 views
0

私の状況は次のとおりです:私はリファクタリングしようとしているアプリを開発しました。私はコントローラの中で基本的にはあまりにも多くのロジックを見つけました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の観点から、より純粋な実装になるだろう...それはおそらくはるかに効率的ではと思いますけれども推測...

+1

あなたは、このようなカスタムメソッドを持つAgent' '実体を持っていると思いますなぜ?どのようなリポジトリが対象ですか?私はリポジトリ内で意味がある場所に置いておきます。エンティティ 'Agent'から直接呼び出す場合は、リポジトリをエンティティに結びつけるだけです。 – ReynierPM

+0

@ReynierPMが言ったように、これはまさにリポジトリのためのものです。 – ccKep

+0

@ReynierPMどのようにしてリポジトリをエンティティに結びつけるのですか?私はより良いOOPのためのエージェントの方法としてそれを持っていたいと思います(エージェントにそのようなメッセージを送るのが自然だと感じています...) – Muc

答えて

0

にリポジトリを結ぶ」ことにより、

use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity 
* @ORM\Table(name="account") 
* @ORM\Entity(repositoryClass="AppBundle\Entity\Repository\AccountRepository") 
*/ 
class Account 
{ 

} 

あなたがリポジトリ内のすべてのカスタム機能を持っているし、可能な意味としてクリーンとしてエンティティを保つことができますこの方法:性質、セッターとゲッター実体は」私には、以下の意味します。

なぜ、エンティティ内でカスタムクエリが必要なのか、それはリポジトリの目的ではありません。あなたがしたいことは、より良いOOPを意味するものではありません。

さらに詳しい情報:

+0

もう少し研究をしています。私はhttps:// pressup.com/jp/blog/2014/11/orm-patterns-active-record-data-mapper/これがなぜうまくいかないのか理解できました。 ActiveRecordやDatamapperを使うのは確かです:p – Muc

関連する問題