Можно ли извлечь строки отображения дискриминатора объекта Doctrine из поля сторонней таблицы базы данных? Если нет, то как обрабатывать сопоставление типов наследования в такой ситуации?
Рассматривая Doctrine 2.7.2 абстрактный объект Person
с конкретными объектами A
и B
, например:
/**
* @MappedSuperclass
* @Table(name="PERSON")
*/
abstract class Person {
/**
* @Id
* @GeneratedValue
*/
protected $id;
/**
* @Column(name="name",type="string")
*/
protected $name;
/**
* @OneToOne(targetEntity="PersonType")
* @JoinColumn(name="type", referencedColumnName="id")
*/
protected $type;
}
/**
* @Entity
* @Table(name="PERSON")
*/
class A extends Person {}
/**
* @Entity
* @Table(name="PERSON")
*/
class B extends Person {}
A Person
имеет тип, привязанный к сущности PersonType
, например:
/**
* @Entity
* @Table(name="PERSON_TYPE")
*/
class PersonType {
/**
* @Id
* @GeneratedValue
*/
protected $id;
/**
* @Column(name="code",type="string")
*/
protected $code;
/**
* @Column(name="name",type="string")
*/
protected $name;
}
Как получить экземпляр нужного класса с помощью методов запроса репозитория, таких как find()
, findBy()
, findById()
, et c?
Набор баз данных:
SELECT * FROM PERSON:
id name type
1 John 1
2 Tom 2
SELECT * FROM PERSON_TYPE:
id code name
1 A Type A
2 B Type B
Ожидаемые результаты:
$entityManager->getRepository("A")->findOneById(2); // null
$entityManager->getRepository("B")->findOneById(2); // B object (Tom)
$entityManager->getRepository("A")->findOneById(1); // A object (John)
Я не могу найти, как указать это с помощью дискриминатора.
В качестве альтернативы у меня есть рабочее решение, реализующее SQLFilter, с тем неудобством, что приходится включать или отключать фильтр.
Альтернативным решением может быть заполнение $ discr ?
(я, конечно, могу использовать метод Person::findByType()
, но было бы неплохо, если бы эта функция напрямую управлялась соответствующие репозитории).