我有一个带有单表继承的映射超类netstat -ln | grep -o -m 1 -E '\S*mysqld?\.sock'
。
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
我想修改现有的/**
* Class SimpleQuestion.
* @ORM\Entity()
*/
class SimpleQuestion extends AbstractQuestion
并将其设为SimpleQuestion
。
保存问题时,我会反序列化并合并问题,其中包含ID和“dtype”以及其他属性。
DropdownQuestion
所以我提交的内容如下:
$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
对象,就像之前在数据库中一样,所以DropdownQuestion的任何独特属性都将丢失,问题将保存为SimpleQuestion。有什么方法可以解决这个问题吗?
答案 0 :(得分:1)
首先,您必须删除现有记录(SimpleQuestion
),然后插入新记录(DropdownQuestion
)。 Doctrine 2中不支持类型转换。
注意。强>
您可以使用纯SQL查询更改discriminator列,但是is absolutely not recommended and will for sure give you problems ...