在阅读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';
我的问题是:如果Person
和Employee
都有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 :(得分: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;
}