Php 更新Symfony2中的实体时的关系-一对一和一对多不';行不通

Php 更新Symfony2中的实体时的关系-一对一和一对多不';行不通,php,symfony,orm,doctrine,Php,Symfony,Orm,Doctrine,我在表单中更新一个实体时遇到了一个问题(它是反向的一方),当该实体使用所有数据正确更新时,与它相关的其他实体却没有更新,即在数据库中,它们引用“主”实体的列保持空值或数据保持不变 代码如下: class Offer { /** * @var ArrayCollection * * @ORM\OneToMany(targetEntity="DealOption", mappedBy="offer", cascade={"persist"}) */ private $dealOptions

我在表单中更新一个实体时遇到了一个问题(它是反向的一方),当该实体使用所有数据正确更新时,与它相关的其他实体却没有更新,即在数据库中,它们引用“主”实体的列保持空值或数据保持不变

代码如下:

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(),
    );
}
根据我的研究和阅读类似的文件问题,它应该按原样工作,但事实并非如此,我怀疑我对这些关系应该如何表现、工作和定义有一些基本的误解,但到目前为止,还没有成功。 如果有任何建议,我将不胜感激

编辑-报价人:

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.

对交易也要这样做。

是否对DealOption和事件实体使用子表单?您可以发布表单定义代码吗?我编辑了问题并添加了OfferType(form Builder)。谢谢您,您是正确的,setEvent和setDealOption中缺少上述语句,但是在添加它并再次运行测试更新后,它仍然不会更新offer\u id列。与此同时,我还设法简单地循环浏览相关交易,并在updateAction中设置它们,这在一定程度上起到了作用,因为它只是添加新添加的数据以提供_id,而不是替换它们。:)在更新操作中编辑:
if($editForm->isValid()){foreach($entity->getDealOptions()作为$dealOpt){$entity->setDealOptions($dealOpt);}
你真的不想做这种循环。因为这是一个一对多的关系,所以我希望你会有一个Offer::addDeal方法。正确处理关系很重要,否则你会有很多其他问题。没错,它应该可以在没有其他特别东西的情况下工作,但仍然-没有我t、 更新报价(即更改交易、事件)后,不会更新引用的id\u报价列。