我的情況如下:我開發了一個應用程序,我試圖重構。基本上我在控制器內部發現了太多的邏輯。如何在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點更純粹的實現......雖然它很可能是效率遠不如......
你爲什麼想有實體'有這樣的自定義方法Agent'?這不是什麼儲存庫的目的?我會把它放在版本庫中的意義上,如果你想直接從實體'Agent'中調用它,那麼只需將版本庫綁定到實體。 – ReynierPM
正如@ReynierPM所說:像這樣的東西正是存儲庫的用途。 – ccKep
@ReynierPM我將如何「將存儲庫綁定到實體」?我希望把它作爲一種更好的面向對象代理的方法(讓代理髮送這樣的消息更加自然......) – Muc