2013-05-16 76 views
2

我正在建造一個使用Symfony 2.2和Doctrine的表單生成器。ArrayCollection的對象擴展了一個抽象的MappedSuperClass

我的實體如下:

  • 形式
  • WidgetText
  • WidgetSelect

我所有的小部件擴展以下類:

/** 
* Widget 
* 
* @ORM\MappedSuperclass 
*/ 
abstract class Widget 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @ORM\ManyToOne(targetEntity="Form", inversedBy="widgets") 
    */ 
    private $form; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="type", type="string", length=255) 
    */ 
    private $type; 

    /** 
    * @var integer 
    * 
    * @ORM\OneToOne(targetEntity="Question") 
    */ 
    private $question; 

    // getters and setters 
} 

我的表單實體外觀像這樣S:

/** 
* Form 
* 
* @ORM\Table(name="form") 
* @ORM\Entity(repositoryClass="Ineat\FormGeneratorBundle\Entity\FormRepository") 
* @UniqueEntity("name") 
* @UniqueEntity("slug") 
*/ 
class Form 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="name", type="string", length=255) 
    */ 
    private $name; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="slug", type="string", length=255) 
    */ 
    private $slug; 

    /** 
    * @var ArrayCollection 
    * 
    * @ORM\OneToMany(targetEntity="Widget", mappedBy="form") 
    */ 
    private $widgets; 


    public function __construct() 
    { 
     $this->widgets = new ArrayCollection(); 
    } 

    // getters and setters 
} 

和一個小部件的實體:

/** 
* Widget 
* 
* @ORM\Table(name="widget_choices") 
* @ORM\Entity 
*/ 
class WidgetChoices extends Widget 
{ 
    /** 
    * @var array 
    * 
    * @ORM\Column(type="array") 
    */ 
    private $choices; 

    // getters and setters 
} 

每當我試圖顯示自己的狀態,我得到了以下錯誤:

Neither property "WidgetText" nor method "getWidgetText()" nor method "isWidgetText()" exists in class "Ineat\FormGeneratorBundle\Entity\Form"

現在看來,這就像如果我的小工具根本沒有擴展Widget。 我需要一種方法來將我的小部件作爲Widget進行投射,或者通過一種方法告訴我的ArrayCollection可以包含擴展Widget的所有內容。

可能嗎?

+0

在'WidgetText'實體,你有一個'$文本「財產和公共的吸氣劑和二流子來吧? – cheesemacfly

+0

是的,我有相應的setter和getter。 – DevAntoine

回答

1

Widget是一個MappedSuperclass(沒有表),Form有一個1-n鍵。由於Widget的每個子類都將在其自己的表中生存,因此這不是有效的關係。換句話說,MappedSuperclass可能沒有n-1關係(更像是一個裝飾器)。

你可以使用通用的外鍵的模式做像你想購買或使用單表繼承了widget,這對你的情況更好(REF http://docs.doctrine-project.org/en/latest/reference/inheritance-mapping.html#single-table-inheritance

table Widget(id, type) 
table WidgetXY(id, X, Y) 
table WidgetQR(id, Q, R) 

WidgetXY的實體將導致Widget(id=7, type=1)的行和WidgetXY(id=7, X, Y)的一行。控制器(原則)將通過使用鑑別器映射標識type=1行,參考WidgetXY,在剛加入的數據庫級別上對照正確的表pkeys 1-1。

在教義,你必須繼承類型設置爲加入,並在註釋定義你的鑑別圖(見上面的鏈接)

心連心

+0

它是我唯一的解決方案嗎?有一張表包含我的小部件和多個空列的所有內容都不夠性感。 – DevAntoine

+0

我仍然有同樣的錯誤。 – DevAntoine

+0

我接受它,因爲你是正確的關係,我需要有一個實體,而不是我的關係映射超類,但我的表單不能仍然顯示。 – DevAntoine