【问题标题】:Symfony Doctrine One to Many does not insert foreign keySymfony Doctrine One to Many 不插入外键
【发布时间】:2015-01-25 11:30:29
【问题描述】:

我在使用一个或多个 OneToMany-Childs 持久化实体时遇到烦人的问题。

我有一个“Buchung”实体,它可以有多个“Einsatztage”(可以翻译成一个有很多天的事件)

在“我拥有的Buchung实体”中

/**
 * @param \Doctrine\Common\Collections\Collection $property
 * @ORM\OneToMany(targetEntity="Einsatztag", mappedBy="buchung", cascade={"all"})
 */
private $einsatztage;

$einsatztage 在 __constructor() 中设置为 ArrayCollection()。

然后是“Einsatztag”实体,它有一个 $Buchung_id 变量来引用“Buchung”

/**
 * @ORM\ManyToOne(targetEntity="Buchung", inversedBy="einsatztage", cascade={"all"})
 * @ORM\JoinColumn(name="buchung_id", referencedColumnName="id")
 */
private $Buchung_id;

现在,如果我尝试将对象持久化到数据库中,“Einsatztag”表的外键始终为空。

$buchung = new Buchung();

$buchung->setEvent(         $r->request->get("event_basis"));
$buchung->setStartDate(new \DateTime($r->request->get("date_from")));
$buchung->setEndDate(new \DateTime($r->request->get("date_to")));


$von = $r->request->get("einsatz_von");
$bis = $r->request->get("einsatz_bis");
$i = 0;
foreach($von as $tag){
    $einsatztag = new Einsatztag();

    $einsatztag->setNum($i);
    $einsatztag->setVon($von[$i]);
    $einsatztag->setBis($bis[$i]);

    $buchung->addEinsatztage($einsatztag);
    $i++;
}

$em = $this->getDoctrine()->getManager();

$em->persist($buchung);

foreach($buchung->getEinsatztage() as $e){
    $em->persist($e);
}
$em->flush();

【问题讨论】:

    标签: php symfony doctrine-orm doctrine persist


    【解决方案1】:

    首先,您必须了解 Doctrine 和 Symfony 不适用于您的实体中的 id。在 Einsatztag 实体中,您的属性不应称为 $Buchung_id,因为它是 buchung 的一个实例,而不是您会在那里找到的 id。

    此外,在您的循环中,您将 Einsatztag 添加到 Buchung。但是你会处理反向集吗?

    我这样做是为了始终反转实体的设置/添加。

    独立标签

    public function setBuchung(Buchung $pBuchung, $recurs = true){
         $this->buchung = $pBuchung;
    
         if($recurs){
            $buchung->addEinsatztag($this, false);
         }
    }
    

    布宗

    public function addEinsatztag(Einsatztag $pEinsatztag, $recurs = true){
         $this->einsatztages[] = $pEinsatztag;
    
         if($recurs){
            $pEinsatztag->setBuchung($this, false);
         }
    }
    

    那么,你什么时候打电话

    $buchung->addEinsatztag($einsatztag);
    

    或者

    $einsatztag->set($buchung);
    

    将在双方设置关系,从而设置您的 FK。请注意这一点,如果您没有正确使用它们,您将有一些行为,例如重复输入。

    SImplier ,您可以使用默认的 getter/setter 并在关系的两侧调用它们,使用您已有的,如下所示:

    $einsatztag->set($buchung);
    $buchung->addEinsatztag($einsatztag);
    

    希望它有所帮助;)

    【讨论】:

      【解决方案2】:

      首先,不要在代码中使用_id 属性。让它成为$buchung。如果您希望它在数据库中,请在注释中进行。这也是为什么它不起作用的原因。您正在映射到 buchung,但您的属性是 $Buchung_id

      <?php
      /** @ORM\Entity **/
      class Buchung
      {
          // ...
      
          /**
           * @ORM\OneToMany(targetEntity="Einsatztag", mappedBy="buchung")
           **/
          private $einsatztage;
      
          // ...
      }
      
      /** @ORM\Entity **/
      class Einsatztag
      {
          // ...
      
          /**
           * @ORM\ManyToOne(targetEntity="Product", inversedBy="einsatztage")
           * @JoinColumn(name="buchung_id", referencedColumnName="id")
           **/
          private $buchung;
      
          // ...
      }
      

      您不必编写@JoinColumn,因为&lt;propertyname&gt;_id 将是默认列名。

      【讨论】:

        【解决方案3】:

        我将忽略命名问题并为实际问题添加修复程序。

        您需要在 adder 方法中调用来设置所有者。

        //Buchung entity 
        public function addEinsatztage($einsatztag)
        {
            $this->einsatztags->add($einsatztag);
            $ein->setBuchung($this);
        }
        

        要在提交表单时调用此加法器,您需要将设置为 falseby_reference 属性添加到表单集合字段。

        这是文档:

        类似地,如果您使用 CollectionType 字段,而您的基础集合数据是一个对象(例如 Doctrine 的 ArrayCollection),那么如果您需要添加器和移除器(例如 addAuthor() 和 removeAuthor( )) 被调用。

        http://symfony.com/doc/current/reference/forms/types/collection.html#by-reference

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-11-03
          • 2017-05-31
          • 1970-01-01
          • 1970-01-01
          • 2019-04-27
          • 1970-01-01
          相关资源
          最近更新 更多