2011-08-23 82 views
2

私人性質,而閱讀Doctrine documentation,我發現這個例子:查詢父的原則

/** 
* @Entity 
* @InheritanceType("SINGLE_TABLE") 
* @DiscriminatorColumn(name="discr", type="string") 
* @DiscriminatorMap({"person" = "Person", "employee" = "Employee"}) 
*/ 
class Person 
{ 
    /** 
    * @Id @Column(type="integer") 
    * @GeneratedValue 
    */ 
    protected $id; 

    /** 
    * @Column(type="string", length=50) 
    */ 
    protected $name; 
} 

/** 
* @Entity 
*/ 
class Employee extends Person 
{ 
    /** 
    * @Column(type="string", length=50) 
    */ 
    private $department; 
} 

根據該文檔時,Employee類可以查詢這樣:

SELECT e FROM Entities\Employee e WHERE e.name = 'test'; 

我的問題是:如果PersonEmployee都具有name屬性,具有不同的範圍和值,那該怎麼辦?例如:

class Person { 
    private $name; 
} 

class Employee extends Person { 
    private $name; 
} 

我的猜測是,這個查詢將針對Employee::$name跑:

SELECT e FROM Entities\Employee e WHERE e.name = 'test'; 

是否有可能的話,對查詢Person::$name,但仍只返回Employee實例?喜歡的東西:

SELECT e FROM Entities\Employee e WHERE e.parent.name = 'test'; 

回答

0

教義實際上,你可以按層次結構只能有一個獨特的屬性名稱,它會在實體使用,通過這種方式使覆蓋類的屬性是不是一個好主意。

在這個例子中有不同的值的唯一方法是定義不同的屬性名稱和數據庫字段:

class Person 
{ 
    // ... 

    /** 
    * @ORM\Column(type="string", length=50) 
    */ 
    protected $name; 
} 

class Employee extends Person 
{ 
    // ... 

    /** 
    * @ORM\Column(type="string", length=50, name="employeeName") 
    */ 
    protected $employeeName; 
} 
+0

謝謝,確實是有道理的DQL這樣! – Benjamin

+1

對於任何感興趣的人,這實際上記錄在[這裏](http://www.doctrine-project.org/docs/orm/2.1/en/reference/architecture.html):「類層次結構中的任何兩個實體類從彼此直接或間接繼承必須不具有相同名稱的映射屬性,也就是說,如果B從A繼承,則B必須不具有與從A繼承的已映射字段具有相同名稱的映射字段。 – Benjamin