PHP Doctrine запрашивает унаследованные классы с помощью карты дискриминаторов

#php #doctrine #doctrine-orm #dql

#php #doctrine #doctrine-orm #dql

Вопрос:

В этом примере:

http://www.doctrine-project.org/docs/orm/2.0/en/reference/dql-doctrine-query-language.html#single-table

мы видим, что

 SELECT e FROM EntitiesEmployee 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 EntitiesPerson 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.