擴展一個實體是要走的路。在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
希望這會有所幫助,不要猶豫,如果您需要更多信息的評論。
問候,
馬特
這是輝煌的。我知道這一定是可能的。謝謝馬特。 –
假設,我有'BaseAuditableEntity.php'有nullable = false的列'lastName',然後將該類擴展到'User.php'。我需要更改上面的coulumn lastname接受空值(空值= true)。你能幫我嗎,怎麼做? –
在你的'User.php'類中,嘗試重新定義'lastName'屬性和與之相關的註釋。也許這會覆蓋之前在基本實體中設置的內容。如果它不起作用,我擔心我不能進一步幫助。嘗試在doctrine2郵件列表上詢問。如果你找到解決方案,不要猶豫,在這裏報告。 – Matt