2

我正在使用带有 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 的所有内容。

可能吗?

4

1 回答 1

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)AND 一行WidgetXY(id=7, X, Y)。控制器(学说)将通过使用鉴别器映射type=1来识别引用的行,在数据库级别上,您只需连接正确的表 pkeys 1-1。WidgetXY

在原则上,您必须将继承类型设置为加入并在注释中定义您的鉴别器映射(参见上面的链接)

hth

于 2013-05-16T16:29:12.073 回答