Symfony2实体关系未按预期工作

时间:2014-12-30 14:54:29

标签: symfony entity relationships

这可能是Symfony2中的一个巨大错误,或者我只是没有得到它。我花了几天时间试图了解这里发生了什么。我有两个实体:

Event
Date

我想要一个关系,一个事件有很多日期。听起来很简单,所以在我的Event实体中我有:

/**
 * @ORM\OneToMany(targetEntity="Date", mappedBy="event")
 */
protected $dates;

在我的Date实体中,我有:

/**
 * @ORM\ManyToOne(targetEntity="Event", inversedBy="dates")
 */
private $event;

我还在Event实体上生成了一个CRUD(doctrine:generate:crud),以便我可以向数据库添加事件。在我的EventType中的表单构建器中,我添加了:

->add('date', new DateType())

根据Symfony文档,我可以在表单中包含日期字段。

现在出现了我的问题。

每当我运行doctrine:generate:实体我的实体都是在Event和Date实体上创建的,但它们似乎是错误的方法。在我的Event实体上,我得到:

/**
 * Constructor
 */
public function __construct()
{
    $this->dates = new \Doctrine\Common\Collections\ArrayCollection();
}

/**
 * Add dates
 *
 * @param \Raygun\EventBundle\Entity\Date $dates
 * @return Event
 */
public function addDate(\Raygun\EventBundle\Entity\Date $dates)
{
    $this->dates[] = $dates;

    return $this;
}

/**
 * Remove dates
 *
 * @param \Raygun\EventBundle\Entity\Date $dates
 */
public function removeDate(\Raygun\EventBundle\Entity\Date $dates)
{
    $this->dates->removeElement($dates);
}

/**
 * Get dates
 *
 * @return \Doctrine\Common\Collections\Collection 
 */
public function getDates()
{
    return $this->dates;
}

在我的日期实体上我得到:

/**
 * Set event
 *
 * @param \Raygun\EventBundle\Entity\Event $event
 * @return Date
 */
public function setEvent(\Raygun\EventBundle\Entity\Event $event = null)
{
    $this->event = $event;

    return $this;
}

/**
 * Get event
 *
 * @return \Raygun\EventBundle\Entity\Event 
 */
public function getEvent()
{
    return $this->event;
}

现在当我尝试加载表单时,我可以将事件/日期添加到我得到的数据库

Neither the property "date" nor one of the methods "getDate()", "date()", "isDate()", "hasDate()", "__get()" exist and have public access in class "Raygun\EventBundle\Entity\Event".

就像它应该将getter和setter添加到Event实体,而不是Date实体。我真的用这个撕掉了我的头发,我想完全抛弃Symfony,因为它似乎完全违背了逻辑。

2 个答案:

答案 0 :(得分:0)

如果您希望表单组件自动填充字段,则应将date字段更改为dates

->add('dates', 'collection', [
    'type' => new DateType()
])

或者您可以在mapped => false字段中添加date选项以手动映射。

答案 1 :(得分:0)

您的活动表单类型应包含protected $dates字段的集合类型,因此该行不正确:

->add('date', new DateType())

应该是:

->add('dates', 'collection', array('type' => new DateType()))

请查看有关如何使用表单集的Symfony cookbook条目:

http://symfony.com/doc/current/cookbook/form/form_collections.html