2017-10-12 57 views
0

我的情況如下:我開發了一個應用程序,我試圖重構。基本上我在控制器內部發現了太多的邏輯。如何在Doctrine2實體內部運行復雜查詢?

我有一些計算,我希望能夠在實體內執行。

例如,有一個實體叫做代理,它與一個與Transaction實體相關的Account實體有關。

在某一點上,我希望從與代理相關的所有賬戶(如果在某個日期範圍內)獲得所有交易的總和。

截至目前我能重構代碼到代理庫,創建一個方法,如:

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); 
} 

但我在這裏讀到其他問題,這不是特別實用也不理想,所以...我應該如何構造這些代碼?

感謝

編輯:

可以做是有代理類解決它沒有任何額外的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我將如何「將存儲庫綁定到實體」?我希望把它作爲一種更好的面向對象代理的方法(讓代理髮送這樣的消息更加自然......) – Muc

回答

0

通過「李鐵資源庫實體」我指的是以下幾點:

use Doctrine\ORM\Mapping as ORM; 

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

} 

這樣,你可以在庫,所有的自定義功能和保持實體儘可能乾淨的含義:性能,getter和setter方法。

仍然沒有看到爲什麼你想要一個實體內部的自定義查詢,這是一個存儲庫的用途。你想做什麼並不意味着更好的面向對象。

更多信息:

+0

好吧...做一些更多的研究我遇到了https:// pressupinc.com/blog/2014/11/orm-patterns-active-record-data-mapper/這幫助我理解了爲什麼這不起作用。不確定現在使用ActiveRecord或Datamapper:p – Muc