2016-01-05 20 views
1

我有一個映射超類AbstractQuestion單表繼承。使用Doctrine合併實體與不同的子類

/** 
* @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,並使其成爲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?'} 

的deserialisation後,$dquestion是我希望的DropdownQuestion對象,但在合併後$questionSimpleQuestion對象,因爲它是在數據庫中以前,因此DropdownQuestion的任何獨特屬性都會丟失,問題將被保存爲SimpleQuestion。有什麼辦法可以解決這個問題嗎?

回答

1

您將首先刪除現有記錄(SimpleQuestion),然後插入新記錄(DropdownQuestion)。 Doctrine 2不支持類型鑄造。


注意。
你或許可以改變與純SQL查詢鑑別列,但這個is absolutely not recommended and will for sure give you problems ...

檢查還答案herehere,因爲他們可能對你有意思。

+0

謝謝。令人失望,但是的確如此。我結束了這種情況,因爲我將存儲在長文本中的序列化對象轉換爲實體。否則,我想我不會考慮改變問題類型。謝謝。 – darkbluesun

相關問題