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
我在持久化具有一个或多个 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