Symfony Doctrine One to Many不插入外键


Symfony Doctrine One to Many does not insert foreign key

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

我有一个"Buchung"实体,它可以有多个"特别行动队"(可以翻译成一个有很多天的事件)

在"布雄实体我有

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

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

然后是"特别行动队"实体,它有一个 $Buchung_id 变量来引用"Buchung"

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

现在,如果我尝试将对象持久化到数据库,则"特别行动队"表的外键始终留空。

$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不能与你的实体中的id一起工作。在特别行动队实体中,你的属性不应该被称为$Buchung_id,因为它是buchung的实例,而不是你会发现的id。

此外,在您的循环中,您将特别行动队添加到布琼。但是你处理反向集吗?

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

特别行动队

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

希望它对;)有所帮助

首先,不要在代码中使用_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

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

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

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

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

以下是文档:

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

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