在 Symfony2 中更新实体时的关系 - 一对一和一对多不起作用
Relations while updating entity in Symfony2 - one-to-one and one-to-many doesn't work
我在更新表单中的实体(它是反面)时遇到问题,虽然实体已使用所有数据正确更新,但与它相关的其他实体却没有,即在数据库中,它们的列引用了"main" 实体保持为空或数据保持不变。
代码如下:
class Offer
{
/**
* @var ArrayCollection
*
* @ORM\OneToMany(targetEntity="DealOption", mappedBy="offer", cascade={"persist"})
*/
private $dealOptions;
/**
* @var Event
*
* @ORM\OneToOne(targetEntity="Event", inversedBy="offer")
* @ORM\JoinColumn(name="event_id", referencedColumnName="id")
*/
private $event;
}
class DealOption
{
/**
* @var Offer
*
* @ORM\ManyToOne(targetEntity="Offer", inversedBy="dealOptions")
* @ORM\JoinColumn(name="offer_id", referencedColumnName="id", onDelete="SET NULL")
*/
private $offer;
}
class Event
{
/**
* @var Offer
*
* @ORM\OneToOne(targetEntity="Offer", mappedBy="event")
* @ORM\JoinColumn(name="offer_id", referencedColumnName="id", onDelete="SET NULL")
*/
private $offer;
以及更新操作:
public function updateAction(Request $request, $id)
{
$em = $this->getDoctrine()->getManager();
$entity = $em->getRepository('AppBundle:Offer')->find($id);
if (!$entity) {
throw $this->createNotFoundException('Unable to find Offer.');
}
$deleteForm = $this->createDeleteForm($id);
$editForm = $this->createEditForm($entity);
$editForm->handleRequest($request);
if ($editForm->isValid()) {
$em->persist($entity);
$em->flush();
return $this->redirect($this->generateUrl('offer'));
}
return array(
'entity' => $entity,
'edit_form' => $editForm->createView(),
'delete_form' => $deleteForm->createView(),
);
}
根据我的研究和阅读文档的类似问题,它应该按原样工作,但事实并非如此,我怀疑我对这些关系应该如何表现、工作和定义有一些基本的误解,但对此没有布埃诺,没有成功的时刻。
如果有任何建议,我将不胜感激。
编辑 - OfferFormBuilder:
class OfferType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('dealOptions')
->add('title')
->add('event')
->add('division')
;
}
null 表示您没有正确地交叉引用对象。这是一个很常见的错误。
class Offer {
public function setEvent($event) {
$this->event = $event;
$event->setOffer($this); // *** This is what you are probably missing.
也对交易执行相同的操作。
我在更新表单中的实体(它是反面)时遇到问题,虽然实体已使用所有数据正确更新,但与它相关的其他实体却没有,即在数据库中,它们的列引用了"main" 实体保持为空或数据保持不变。
代码如下:
class Offer
{
/**
* @var ArrayCollection
*
* @ORM\OneToMany(targetEntity="DealOption", mappedBy="offer", cascade={"persist"})
*/
private $dealOptions;
/**
* @var Event
*
* @ORM\OneToOne(targetEntity="Event", inversedBy="offer")
* @ORM\JoinColumn(name="event_id", referencedColumnName="id")
*/
private $event;
}
class DealOption
{
/**
* @var Offer
*
* @ORM\ManyToOne(targetEntity="Offer", inversedBy="dealOptions")
* @ORM\JoinColumn(name="offer_id", referencedColumnName="id", onDelete="SET NULL")
*/
private $offer;
}
class Event
{
/**
* @var Offer
*
* @ORM\OneToOne(targetEntity="Offer", mappedBy="event")
* @ORM\JoinColumn(name="offer_id", referencedColumnName="id", onDelete="SET NULL")
*/
private $offer;
以及更新操作:
public function updateAction(Request $request, $id)
{
$em = $this->getDoctrine()->getManager();
$entity = $em->getRepository('AppBundle:Offer')->find($id);
if (!$entity) {
throw $this->createNotFoundException('Unable to find Offer.');
}
$deleteForm = $this->createDeleteForm($id);
$editForm = $this->createEditForm($entity);
$editForm->handleRequest($request);
if ($editForm->isValid()) {
$em->persist($entity);
$em->flush();
return $this->redirect($this->generateUrl('offer'));
}
return array(
'entity' => $entity,
'edit_form' => $editForm->createView(),
'delete_form' => $deleteForm->createView(),
);
}
根据我的研究和阅读文档的类似问题,它应该按原样工作,但事实并非如此,我怀疑我对这些关系应该如何表现、工作和定义有一些基本的误解,但对此没有布埃诺,没有成功的时刻。 如果有任何建议,我将不胜感激。
编辑 - OfferFormBuilder:
class OfferType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('dealOptions')
->add('title')
->add('event')
->add('division')
;
}
null 表示您没有正确地交叉引用对象。这是一个很常见的错误。
class Offer {
public function setEvent($event) {
$this->event = $event;
$event->setOffer($this); // *** This is what you are probably missing.
也对交易执行相同的操作。