ArrayCollection扩展抽象MappedSuperClass的对象

时间:2013-05-16 15:41:26

标签: symfony doctrine-orm relationship arraycollection

我正在使用带有Doctrine的Symfony 2.2构建表单生成器。

我的实体如下:

  • 表格
  • 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
}

我的表单实体如下所示:

/**
 * 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的所有内容。

有可能吗?

1 个答案:

答案 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