在Doctrine中查询超类的私有属性

时间:2011-08-23 12:30:52

标签: php inheritance doctrine doctrine-orm

在阅读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';

1 个答案:

答案 0 :(得分:0)

使用Doctrine,每个层次结构实际上只能有一个唯一的属性名称,它将在Entity中使用,因此以这种方式覆盖类属性不是一个好主意。

在此示例中,使用不同值的唯一方法是定义不同的属性名称和数据库字段:

class Person
{
    // ...

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

class Employee extends Person
{
    // ...

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