【问题标题】:PHP Doctrine querying inherited classes with discriminator mapPHP Doctrine 使用鉴别器映射查询继承的类
【发布时间】: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'

返回所有记录。

有什么想法吗?

【问题讨论】:

    标签: php doctrine doctrine-orm dql


    【解决方案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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-01
      • 1970-01-01
      • 2014-02-12
      • 2012-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多