我在使用一个或多个 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);
}
要在提交表单时调用此加法器,您需要将设置为 false
的 by_reference
属性添加到表单集合字段中。
以下是文档:
类似地,如果您使用的是 CollectionType 字段,其中您的底层集合数据是一个对象(如 Doctrine 的 ArrayCollection),那么如果您需要调用 adder 和 remover(例如 addAuthor() 和 removeAuthor()),则必须将 by_reference 设置为 false。
http://symfony.com/doc/current/reference/forms/types/collection.html#by-reference