Как сопоставить тип, когда ключи карты не находятся в таблице сущностей с Doctrine? - PullRequest
0 голосов
/ 05 мая 2020

Можно ли извлечь строки отображения дискриминатора объекта 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(), но было бы неплохо, если бы эта функция напрямую управлялась соответствующие репозитории).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...