我有一个带有单表继承的映射父类(super class) AbstractQuestion
。
/**
* @ORM\Entity
* @ORM\MappedSuperclass
* @ORM\Table(name="Question")
* @ORM\InheritanceType("SINGLE_TABLE")
* @ORM\DiscriminatorColumn(name="dtype", type="string")
* @ORM\DiscriminatorMap({
* "simple": "SimpleQuestion",
* "dropdown": "DropdownQuestion"
* })
*/
abstract class AbstractQuestion
SimpleQuestion
和 DropdownQuestion
继承自该父类(super class)。
/**
* Class SimpleQuestion.
* @ORM\Entity()
*/
class SimpleQuestion extends AbstractQuestion
我想修改现有的 SimpleQuestion
并使其成为 DropdownQuestion
。
保存问题时,我反序列化并合并问题,其中包含 ID 和“dtype”及其他属性。
$dquestion = $this->serial->fromJson($request->getContent(), AbstractQuestion::class);
$question = $this->em->merge($dquestion);
$this->em->flush();
所以我提交了类似的东西:
{ id: 12, dtype: 'dropdown', 'text': 'What is my favourite animal?'}
在反序列化之后,$dquestion
是一个 DropdownQuestion
对象,正如我所希望的那样,但是在合并之后 $question
是一个 SimpleQuestion
对象,因为它之前在数据库中,所以 DropdownQuestion 的任何唯一属性都将丢失,问题将保存为 SimpleQuestion。有什么办法可以解决这个问题吗?
最佳答案
您首先必须删除现有记录 (SimpleQuestion
),然后插入新记录 (DropdownQuestion
)。 Doctrine 2 不支持类型转换。
注意。
您或许可以使用纯 SQL 查询更改鉴别器列,但是这 is absolutely not recommended and will for sure give you problems ...
关于symfony - 使用 Doctrine 将实体与不同的子类合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34622102/