Symfony Doctrine一对多关系不插入外键。

3
我正在遇到一个烦人的问题,即如何持久化一个具有一个或多个OneToMany子实体的实体。
我有一个“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();
3个回答

0
首先,您必须了解Doctrine和Symfony不使用实体内的ID。在Einsatztag实体中,您的属性不应该被称为$Buchung_id,因为它是buchung的一个实例,而不是您可以找到的ID。
此外,在您的循环中,您将Einsatztag添加到Buchung中。但是,您是否处理了反向设置?
我总是以这种方式进行实体的反向设置/添加。
Einsatztag
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被设置。请注意,如果不正确使用它们,您将会遇到一些重复条目的行为。

更简单的方法是,您可以使用默认的getter/setters,并在关系的两侧调用它们,使用您已经拥有的内容,如下所示:

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

希望它有所帮助 ;)

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


-1

我将忽略命名问题并针对实际问题添加修复。

您需要在adder方法中调用set owner。

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

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

以下是文档:

同样,如果您正在使用CollectionType字段,其中底层集合数据是对象(例如Doctrine的ArrayCollection),则如果需要调用adder和remover(例如addAuthor()和removeAuthor()),则必须将by_reference设置为false。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接