Symfony Doctrine One to Many 不插入外键

Symfony Doctrine One to Many does not insert foreign key

我在持久化具有一个或多个 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”的外键 Table 始终为空。

$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();

首先,你必须明白 Doctrine 和 Symfony 不能在你的 entities.In Einsatztag 实体中使用 id,你的 属性 不应该被称为 $Buchung_id 因为它是一个实例buchung 的,而不是你会在那里找到的 id。

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

我这样做是为了始终反转实体的 set/add。

别动队

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/setters 并在关系的两边调用它们,使用您已有的,如下所示:

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

希望对您有所帮助 ;)

首先,不要在代码中使用 _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,因为 <propertyname>_id 将是默认的列名。

我将忽略命名问题并修复实际问题。

您需要在加法器方法中调用以设置所有者。

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

要在提交表单时调用此加法器,您需要将 by_reference 属性 设置为 false.

添加到表单集合字段

这是文档:

Similarly, if you're using the CollectionType field where your underlying collection data is an object (like with Doctrine's ArrayCollection), then by_reference must be set to false if you need the adder and remover (e.g. addAuthor() and removeAuthor()) to be called.

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