使用Doctrine将实体与不同的子类合并

时间:2016-01-05 22:08:54

标签: symfony inheritance doctrine-orm merge doctrine

我有一个带有单表继承的映射超类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。有什么方法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

首先,您必须删除现有记录(SimpleQuestion),然后插入新记录(DropdownQuestion)。 Doctrine 2中不支持类型转换。

注意。
您可以使用纯SQL查询更改discriminator列,但是is absolutely not recommended and will for sure give you problems ...

同时检查答案herehere,因为它们可能对您有用。