PHP Doctrine 使用鉴别器映射查询继承的类
Posted
技术标签:
【中文标题】PHP Doctrine 使用鉴别器映射查询继承的类【英文标题】:PHP Doctrine querying inherited classes with discriminator map 【发布时间】:2011-10-25 08:27:45 【问题描述】:在这个例子中:
http://www.doctrine-project.org/docs/orm/2.0/en/reference/dql-doctrine-query-language.html#single-table
我们看到了
SELECT e FROM Entities\Employee e WHERE e.name = 'test'
进行此查询:
SELECT p0_.id AS id0, p0_.name AS name1, p0_.department AS department2,
p0_.discr AS discr3 FROM Person p0_ WHERE (p0_.name = ?) AND p0_.discr IN ('employee')
有没有办法只用鉴别器“Person”查询记录?
这个:
SELECT e FROM Entities\Person e WHERE e.name = 'test'
返回所有记录。
有什么想法吗?
【问题讨论】:
【参考方案1】:默认情况下,继承映射实体中的父实体似乎不使用鉴别器规则。
我通过创建一个基类/实体来解决这个问题。
/**
* @Entity
* @InheritanceType("SINGLE_TABLE")
* @DiscriminatorColumn(name="discr", type="string")
* @DiscriminatorMap("person" = "Person", "employee" = "Employee")
*/
class PersonBase
/**
* @Id @Column(type="integer")
* @GeneratedValue
*/
protected $id;
/**
* @Column(type="string", length=50)
*/
protected $name;
// ...
/**
* @Entity
*/
class Person extends PersonBase
/**
* @Entity
*/
class Employee extends PersonBase
/**
* @Column(type="string", length=50)
*/
private $department;
// ...
现在 Person 将使用判别器规则,您无需直接引用 PersonBase。
【讨论】:
以上是关于PHP Doctrine 使用鉴别器映射查询继承的类的主要内容,如果未能解决你的问题,请参考以下文章