2011-12-09 27 views
9

在舊版本的Symfony中,您曾經能夠通過擴展帶有擴展子類的模型類來在數據對象中構建新對象。如何像在Symfony 1中那樣擴展Symfony2中的實體?

例如,我有一個問卷模型,有一個結果表。該結果表有一個Result.php模型類,用於通過Doctrine設置和獲取結果。然後,我使用ResultPeer.php模型子類向結果對象添加了一個新函數,該結果取決於一組固定的閾值計算得分和相應的顏色。

在新的使用Doctrine2的Symfony2版本中,我正在努力找出最好的方法來做到這一點。創建實體時,我只能在文檔中找到根據數據結構關係添加對象的功能。

我查看了實體存儲庫,但似乎並未擴展或向原始對象添加功能。它似乎基於比標準查詢功能更復雜的查詢來恢復數據對象。

我也看了一下服務,我可以用它來收集對象,然後使用該對象創建一個包含此對象和新創建的數據的新數組,但這看起來不正確或遵循Symfony是所有關於。

有誰知道如何將函數添加到現有的數據對象。我發現它在Symfony的舊版本中非常有用,但似乎無法在新版本的Symfony2中找到替代方案。

回答

18

擴展一個實體是要走的路。在Doctrine2世界中,他們討論繼承映射。這裏有一個代碼示例。它定義了一個BaseEntity,然後它被擴展爲創建一個BaseAuditableEntity,並最終有一個User實體,延伸BaseAuditableEntity。訣竅是使用@Orm\MappedSuperclass註釋。即使在我的關係圖中有三個實體,此繼承方案也會創建單個表。這會將所有屬性合併到一個表中。創建的表格將包含通過關係映射的每個屬性,即BaseAuditableEntity和User的屬性。下面的代碼示例:

Acme\WebsiteBundle\Entity\BaseEntity.php

namespace Acme\WebsiteBundle\Entity; 

use Doctrine\ORM\Mapping as Orm; 

/** 
* @Orm\MappedSuperclass 
*/ 
class BaseEntity { 

} 

Acme\WebsiteBundle\Entity\BaseAuditableEntity.php

namespace Acme\WebsiteBundle\Entity; 

use Doctrine\ORM\Mapping as Orm; 

/** 
* @Orm\MappedSuperclass 
*/ 
class BaseAuditableEntity extends BaseEntity { 

    private $createdBy; 

    /** 
    * @Orm\Column(type="datetime", name="created_at") 
    */ 
    private $createdAt; 

    /** 
    * @Orm\ManyToOne(targetEntity="User") 
    * @Orm\JoinColumn(name="updated_by", referencedColumnName="id") 
    */ 
    private $updatedBy; 

    /** 
    * @Orm\Column(type="datetime", name="updated_at") 
    */ 
    private $updatedAt; 

    // Setters and getters here 
} 

Acme\WebsiteBundle\Entity\User.php

namespace Acme\WebsiteBundle\Entity; 

use Acme\WebsiteBundle\Entity\BaseAuditableEntity; 

use Doctrine\ORM\Mapping as Orm; 

/** 
* @Orm\Entity(repositoryClass="Acme\WebsiteBundle\Entity\Repository\UserRepository") 
* @Orm\Table(name="acme_user") 
*/ 
class User extends BaseAuditableEntity implements AdvancedUserInterface, \Serializable 
{ 
    /** 
    * @Orm\Id 
    * @Orm\Column(type="integer") 
    * @Orm\GeneratedValue 
    */ 
    private $id; 

    /** 
    * @Orm\Column(type="string", name="first_name") 
    */ 
    private $firstName; 

    /** 
    * @Orm\Column(type="string", name="last_name") 
    */ 
    private $lastName; 

    /** 
    * @Orm\Column(type="string", unique="true") 
    */ 
    private $email; 

    // Other properties 

    // Constructor 

    // Setters and getters 
} 

這裏學說2.1正式繼承映射文檔的鏈接:here

希望這會有所幫助,不要猶豫,如果您需要更多信息的評論。

問候,
馬特

+1

這是輝煌的。我知道這一定是可能的。謝謝馬特。 –

+0

假設,我有'BaseAuditableEntity.php'有nullable = false的列'lastName',然後將該類擴展到'User.php'。我需要更改上面的coulumn lastname接受空值(空值= true)。你能幫我嗎,怎麼做? –

+0

在你的'User.php'類中,嘗試重新定義'lastName'屬性和與之相關的註釋。也許這會覆蓋之前在基本實體中設置的內容。如果它不起作用,我擔心我不能進一步幫助。嘗試在doctrine2郵件列表上詢問。如果你找到解決方案,不要猶豫,在這裏報告。 – Matt