2015-01-25 2 views
1

У меня возникают неприятные проблемы с сохранением сущности с одним или несколькими OneToMany-Childs.Symfony Doctrine One to Many не вставляет внешний ключ

У меня есть объект «Buchung», который может иметь несколько «Einsatztage» (может быть переведен на мероприятие с большим количеством дней)

В «Buchung сущности У меня есть

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

$ einsatztage является установлен в ArrayCollection() в __constructor().

Тогда есть "Einsatztag" Сущность которым имеет переменную $ Buchung_id для ссылки на "Buchung"

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

Теперь если я пытаюсь сохранить объект в базу данных внешнего ключа в таблице «Einsatztag» всегда находится слева пустой

$ buchung = новый 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(); 

ответ

0

Во-первых, вы должны понимать, что Учение и Symfony не работают с идентификаторами в вашем entities.In Einsatztag лица, ваше имущество не следует назвать $ Buchung_id, так как это экземпляр buchung, а не идентификатор вы будете узнайте там.

Кроме того, в вашей петле вы добавляете Einsatztag в Buchung. Но обрабатываете ли вы реверс?

Я делаю это таким образом, чтобы всегда менять набор/добавление объектов.

Einsatztag

public function setBuchung(Buchung $pBuchung, $recurs = true){ 
    $this->buchung = $pBuchung; 

    if($recurs){ 
     $buchung->addEinsatztag($this, false); 
    } 
} 

Buchung

public function addEinsatztag(Einsatztag $pEinsatztag, $recurs = true){ 
    $this->einsatztages[] = $pEinsatztag; 

    if($recurs){ 
     $pEinsatztag->setBuchung($this, false); 
    } 
} 

Затем, когда вы будете называть

$buchung->addEinsatztag($einsatztag); 

Или

$einsatztag->set($buchung); 

Отношение будет установлено с обеих сторон, чтобы ваш FK был установлен. Позаботьтесь об этом, у вас будет какое-то поведение, такое как двойные записи, если вы не используете их должным образом.

проще, вы можете использовать по умолчанию геттера/сеттер и называть их по обе стороне от вашего отношения, используя то, что у вас уже есть, как следующее:

$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

Я собираюсь игнорировать проблему именования и добавить исправление к реальной проблеме.

Вам необходимо иметь в методе сумматора вызов для установки владельца.

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

И иметь этот сумматор вызывается, когда форма была отправлена ​​вам необходимо добавить в поле коллекции образуют by_reference набор свойств для false.

Вот документация:

Точно так же, если вы используете поле CollectionType, где ваш основной сбор данных является объект (например, с ArrayCollection Доктрины в), то by_reference должен быть установлен в ложь, если вам нужно сумматор и удаление (например, addAuthor() и removeAuthor()) для вызова.

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