2013-04-17 33 views
0

我感到困惑如何去增加功能,以我的實體。添加功能Symfony2的實體

說我有增加收費表。我的數據庫表有這些領域

  • COMPANY_ID
  • 日期

,我已經在我的Symfony2項目做了相應的FeeIncrease實體。

現在,我的應用程序的一部分,我需要顯示的HTML表的特定月份發生的所有費用的增加。該表將包括從數據庫表中的所有領域,也將包含一個附加字段:過往的收費金額。事情是這樣的:

company_id | date  | amount | previous_amount 
-----------+------------+--------+---------------- 
1   | 2013-02-03 | 500 | 400 
3   | 2013-02-15 | 1000 | 800 
8   | 2013-02-20 | 1100 | 500 

它從數據庫角度思考,每個行會要求選擇從表中的最新費用增加一個子查詢(即,它會查詢費增加了最新的日期的日期前目前的增長)。

目前我正在使用Native SQL寫出子查詢,但業務邏輯的複雜性已經清楚地表明這不是一個長期的解決方案。不同的頁面將需要不同的'where'子句,所以我將爲每個頁面編寫一個新的查詢。此外,還有的是需要被應用到田間地頭自己更多的邏輯,我寧願這個邏輯一些其他對象中封裝,而不是它周圍漂浮我的控制器和視圖,因爲它是現在。

我的問題是,本質上,我如何添加額外的屬性,依賴於實體數據到我的實體?

理想情況下,我會添加一個$previousAmount屬性到我的FeeIncrease實體。 getPreviousAmount將是一個爲我完成複雜查詢的方法。但是我怎樣才能添加這個方法並使其能夠利用Doctrine的功能?例如,假設我用->findAll()獲得的加費的數組。然後,在我的模板,我通過數組迭代,但每個費增加我顯示前一個量:

{% for feeIncrease in feeIncreases %} 
    {{ feeInrease.previousAmount }} 
{% endfor %} 

這將導致另一個數據庫調用,每個增加。考慮到我想要顯示的收費數量,這對我來說是無法使用的。

任何指針將不勝感激。

UPDATE:

這裏就是我在談論的一個例子。

我上面描述的費用增加與合同有關。每份合同都有很多費用的增加。每個月,每個合約都有一個「當前」的費用,這是由以下規則發現:

  • 如果合同有新的費用增加是本月起,使用量。
  • 如果合約的收費在當月結束,而不是另一個跟進,則使用該金額。

還有其他規則。所以我的問題是,我可以在哪裏放置這些規則,以便當我實際使用我的contractfeeIncrease對象時,我可以使用像contract.currentFee這樣的方法,而無需在所有地方添加所有這些邏輯?

+0

你爲什麼不能救'previous_amount'創建存儲庫的實體作爲一個領域? – Inoryy

+0

我沒有控制數據庫。還有其他幾種我需要這種功能的情況。 –

回答

0

您可以使用與您的實體耦合的repository:這樣您可以將所有sql(或DQL或查詢生成器)保留在相同的位置,甚至可以參數化它。
此方法的一個優點是,您甚至可以使用相同的查詢獲取所有數據,並將返回值用於樹枝模板而無需對原則的延遲加載設施執行回退操作。

所以,你將有一個像FeeIncrease

/** 
* @ORM\Table(name="FeeIncrease") 
* @ORM\Entity(repositoryClass="Company\BundleNameBundle\Repository\FeeIncreaseRepository") 
*/ 

class FeeIncrease 
{ 
    [...] 
} 

其中指定庫位置,然後,你以這種方式

//Company\BundleNameBundle\Repository\FeeeIncreaseRepository 
<?php 

namespace Company\BundleNameBundle\Repository; 

use Doctrine\ORM\EntityRepository; 

/** 
* FeeIncreaseRepository 
* 
* This class was generated by the Doctrine ORM. Add your own custom 
* repository methods below. 
*/ 

class FeeIncreaseRepository extends EntityRepository 
{ 
    public function myCostumQuery($paramers) 
    { 
    //your own logic here 
    } 
} 
+0

這就是我現在正在做的。參數可能會有所幫助,但仍然有很多邏輯我不想留在控制器中。我真的在尋找如何創建一個使用實體數據的新對象。 –

+0

@SamSelikoff:什麼邏輯?沒有代碼是非常困難的。我可以向您建議的是提供服務,遷移其中的所有業務邏輯並使用存儲庫進行查詢。是最好的方式來處理 – DonCallisto

+0

我添加了一些代碼。我對服務瞭解不多,所以我想我應該多瞭解一些服務。感謝您一直以來的幫助。也許我的代碼會讓我的問題更清晰一些。 –