我正在使用带有Doctrine的Symfony 2.2构建表单生成器。
我的实体如下:
我的所有小部件都扩展了以下类:
/**
* 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
}
我的表单实体如下所示:
/**
* 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实体:
/**
* Widget
*
* @ORM\Table(name="widget_choices")
* @ORM\Entity
*/
class WidgetChoices extends Widget
{
/**
* @var array
*
* @ORM\Column(type="array")
*/
private $choices;
// getters and setters
}
每当我尝试显示表单时,都会出现以下错误:
“Ineat \ FormGeneratorBundle \ Entity \ Form”类中不存在属性“WidgetText”和方法“getWidgetText()”以及方法“isWidgetText()”
似乎就像我的小部件根本没有扩展Widget一样。 我需要一种方法来将我的小部件转换为Widget,或者告诉学说我的ArrayCollection可以包含扩展Widget的所有内容。
有可能吗?
答案 0 :(得分:1)
Widget
是MappedSuperclass(无表),Form
有一个1-n键。由于Widget
的每个子类都将存在于自己的表中,因此这不是一个有效的关系。或者换句话说,MappedSuperclass可能没有n-1关系(想象它更像装饰器)。
您可以使用通用外键范例来执行此操作,或者使用widget
的单表继承,这对您的情况更有效(参考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
的{{1}}行,在刚刚加入正确表的数据库级别上,pkeys 1-1。
在学说中,您必须将继承类型设置为已连接,并在注释中定义您的鉴别器地图(请参阅上面的链接)
HTH