php - Symfony Doctrine One to Many 不插入外键

标签 php symfony doctrine-orm doctrine persist

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

$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 不能在你的实体中使用 id。在 Einsatztag 实体中,你的属性不应该被称为 $Buchung_id 因为它是 buchung 的一个实例而不是你会在那里找到的 id。

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

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

别动队

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

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

希望对您有所帮助 ;)

关于php - Symfony Doctrine One to Many 不插入外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28135863/

相关文章:

php - Symfony 2 配置页面没有样式

php - Doctrine 2 : calling flush multiple times

php - MySQL QUERY - 循环遍历表并执行条件计算(适用于 PHP)

php - Symfony2 : Open PDF file in browser

arrays - Twig - 为什么它不允许我们设置对象/数组值?

Symfony/Twig 在 if 条件下设置变量

php - Symfony 2 - 在 preSubmit 事件订阅者上向表单元素添加错误

php - Symfony 表单字段属性 empty_data 被忽略

php - Symfony MongoDb 无法检索新字段值

php - 如何使用 json api 将 Lat Long 转换为 php 中的地址?