Резюме: Doctrine Embedded типы не заполняются, когда они содержатся в сущностях, которые сами содержатся в другой сущности верхнего уровня.
подробности: У меня есть субъект высшего уровня A
который имеет ManyToOne
отношения с субъектом промежуточного уровня B
который в свою очередь имеет встроенный объект C
,
Когда я получаю сущность верхнего уровня (используя $entityManager->getRepository(A::class)->find($aid)
), возвращенный объект $b
переменная имеет свой $c
свойство явно установлено в нуль (а не — как вы могли бы ожидать — вообще отсутствует). Опрос $c
собственность не вызывает B
гидратировать — вместо этого $ c остается нулевым.
Если я сначала введу фиктивный вызов, чтобы получить простое свойство B
например reference
, затем B
правильно гидратирует и $c
заполнен правильно.
Точно так же, если я приду на промежуточном уровне с $entityManager->getRepository(B::class)->find($bid)
тогда проблем тоже нет.
Это ограничение в доктрине?
(Возможным усложняющим фактором является тот факт, что сам A является базовым классом для 2 других объектов)
/**
* @Entity
* @InheritanceType("SINGLE_TABLE")
* @DiscriminatorColumn(name="type", type="string")
* @DiscriminatorMap({"child1" = "Child1 "child2" = "Child2"})
* @Table(name="A")
*/
class A
{
/**
* @ManyToOne(targetEntity="Model\B", inversedBy="As")
* @JoinColumn(name="b_id", referencedColumnName="id",)
* @var B
*/
public $b;
}
/**
* @Entity
* @Table(name="b")
*/
class B
{
/**
* @Embedded(class="Model\C", columnPrefix = false)
* @var C
*/
public $c;
/**
* @Column(type="string")
* @var string
*/
public $reference;
}
/**
* @Embeddable
*/
class C
{
/**
* @Column(type="smallint")
* @var int
*/
public $type;
}
Задача ещё не решена.
Других решений пока нет …