如何在Doctrine2实体中运行复杂查询?

时间:2017-10-12 15:37:31

标签: symfony doctrine

我的情况如下:我开发了一个应用程序,我正在尝试重构。我基本上在控制器内部找到了太多的逻辑。

我希望能够在实体内执行一些计算。

例如,有一个名为Agent的实体,它与名为Account的实体相关,该实体与Transaction实体相关。

有一次,我希望得到与代理相关的所有账户中的所有交易的总和(在特定日期范围内)。

截至目前,我能够将代码重构到代理存储库中,创建一个方法,如:

AgentRepository::getTransactionSum(Agent $agent, \DateTimeImmutable $dateFrom, \DateTimeImmutable $dateTo)

它工作正常,它比方法在控制器内部的旧版本更好,但我希望能够直接向代理提出这个问题,例如:

Agent::getTransactionSum(\DateTimeImmutable $dateFrom, \DateTimeImmutable $dateTo)

我想过使用类似的东西:

Agent::getTransactionSum(\DateTimeImmutable $dateFrom, \DateTimeImmutable $dateTo) {
   return $this->getRepository()->getTransactionSum( $this, $dateFrom, $dateTo );
}

但是我在这里读到其他问题,这不是特别实用也不可取,所以...我应该如何构建这段代码呢?

由于

编辑:

可以做的一件事是让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 个答案:

答案 0 :(得分:0)

通过&#34;将存储库绑定到实体&#34;我的意思是:

use Doctrine\ORM\Mapping as ORM;

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

}

通过这种方式,您可以在存储库中拥有所有自定义函数,并使实体保持尽可能干净,这意味着:属性,设置器和getter。

仍然没有看到为什么要在实体内部进行自定义查询,这就是存储库的用途。你想做的并不意味着更好的OOP。

更多信息: