Доктрина сохраняет только последнюю коллекцию

Мне нужна помощь, я работаю над ZF2 с доктриной 2.
У меня есть одна сущность: TaFoo с детьми: TaBar (ArrayCollection). У TaBar также есть дочерние элементы: ATypeBar (ArrayCollection) ассоциируется с TypeBar.
Я использую FieldSets для добавления нескольких TaBar, и на каждом TaBar я хочу добавить несколько ATypeBars.

Но когда я сохраняю:

  • TaFoo это создать и сохранить
  • TaBar также создавать и сохранять
  • TaTypeBar сохранит только последнюю коллекцию

У меня нет ошибок, но первые коллекции никогда не сохраняются.

Сущность:
TaFoo

  class TaFoo{
/**
* @var integer
* @ORM\Column(name="ID_FOO", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="SEQUENCE")
* @ORM\SequenceGenerator(sequenceName="TA_FOO_ID_FOO_seq", allocationSize=1, initialValue=1)
*/

private $idFoo;
/**
* Get idFoo
*
* @return integer
*/
public function getIdFoo()
{
return $this->idFoo;
}

/**
* @ORM\OneToMany(targetEntity="TaBar", mappedBy="idFoo", cascade={"persist", "remove"}, orphanRemoval=true)
**/
private $idBar;

/**
* Get idBar
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getIdBar()
{
return $this->idBar;
}
/**
* Remove idBar
*
* @param \Doctrine\Common\Collections\Collection $idBar
*/
public function removeIdBar(\Doctrine\Common\Collections\Collection $idBars)
{
foreach ($idBars as $idBar) {
$idBar->setIdFoo(null);
$this->idBar->removeElement($idBar);
}
}
/**
* Add idBar
*
* @param \Doctrine\Common\Collections\Collection $idBar
* @return TaFoo
*/
public function addIdBar(\Doctrine\Common\Collections\Collection $idBars)
{
foreach ($idBars as $idBar) {
$idBar->setIdFoo($this);
$this->idBar->add($idBar);
}

return $this;
}
}

табар

class TaBar {

// **************************************************TYPE BAR***************************************************
/**
* @ORM\OneToMany(targetEntity="Application\Entity\ATypeBar", mappedBy="idBar", cascade={"persist", "remove"}, orphanRemoval=true)
* */
private $idATypeBars;

/**
* Get typeBar
* @return \Doctrine\Common\Collections\Collection
*/
public function getIdATypeBars() {
return $this->idATypeBars;
}

/**
* Remove typeBar
* @param \Doctrine\Common\Collections\Collection $typeBars
*/
public function removeIdATypeBars(\Doctrine\Common\Collections\Collection $idATypeBars) {
foreach ($idATypeBars as $idATypeBar) {
$idATypeBar->setIdBar(null);
$this->idATypeBars->removeElement($idATypeBar);
}
}

/**
* Add typeBar
* @param \Doctrine\Common\Collections\Collection $typeBars
* @return TaBar
*/
public function addIdATypeBars(\Doctrine\Common\Collections\Collection $idATypeBars) {
foreach ($idATypeBars as $idATypeBar) {
$idATypeBar->setIdBar($this);
$this->idATypeBars->add($idATypeBar);
}

return $this;
}

ATypeBar

class ATypeBar
{
/**
* @var integer
*
* @ORM\Column(name="ID_A_TYPE_Bar", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="SEQUENCE")
* @ORM\SequenceGenerator(sequenceName="A_TYPE_Bar_ID_A_TYPE_Bar_seq", allocationSize=1, initialValue=1)
*/
private $idATypeBar;

/**
* @var \Application\Entity\TaBar
*
* @ORM\ManyToOne(targetEntity="Application\Entity\TaBar",cascade={"persist"},inversedBy="idATypeBar")
* @ORM\JoinColumns({
*   @ORM\JoinColumn(name="ID_Bar", referencedColumnName="ID_Bar")
* })
*/
private $idBar;

/**
* @var \Application\Entity\TaTypeBar
*
* @ORM\ManyToOne(targetEntity="Application\Entity\TaTypeBar")
* @ORM\JoinColumns({
*   @ORM\JoinColumn(name="ID_TYPE_Bar", referencedColumnName="ID_TYPE_Bar")
* })
*/
private $idTypeBar;/**
* Get idATypeBar
*
* @return integer
*/
public function getIdATypeBar()
{
return $this->idATypeBar;
}

/**
* Set idBar
*
* @param \Application\Entity\TaBar $idBar
* @return ATypeBar
*/
public function setIdBar(\Application\Entity\TaBar $idBar = null)
{
$this->idBar = $idBar;

return $this;
}

/**
* Get idBar
*
* @return \Application\Entity\TaBar
*/
public function getIdBar()
{
return $this->idBar;
}

/**
* Set idTypeBar
*
* @param \Application\Entity\TaTypeBar $idTypeBar
* @return ATypeBar
*/
public function setIdTypeBar(\Application\Entity\TaTypeBar $idTypeBar = null)
{
$this->idTypeBar = $idTypeBar;

return $this;
}

/**
* Get idTypeBar
*
* @return \Application\Entity\TaTypeBar
*/
public function getIdTypeBaru()
{
return $this->idTypeBar;
}
}

TaTypeBar

class TaTypeBar {

/**
* @ORM\OneToMany(targetEntity="ATypeBar", mappedBy="idTypeBar", cascade={"persist", "remove"}, orphanRemoval=true)
* */
private $typeBar;/**
* @var integer
*
* @ORM\Column(name="ID_TYPE_Bar", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="SEQUENCE")
* @ORM\SequenceGenerator(sequenceName="TA_TYPE_BarDE_ID_TYPE_Bar_seq", allocationSize=1, initialValue=1)
*/
private $idTypeBar;

/**
* Constructor
*/
public function __construct() {
$this->idBar = new \Doctrine\Common\Collections\ArrayCollection();
}

/**
* Get idTypeBar
*
* @return integer
*/
public function getIdTypeBar() {
return $this->idTypeBar;
}

/**
* Add idBar
*
* @param \Application\Entity\TaBar $idBar
* @return TaTypeBar
*/
public function addIdBar(\Application\Entity\TaBar $idBar) {
$this->idBar[] = $idBar;

return $this;
}

}

Fieldset
TaFoo Fieldset

*[..HERE: Some Elements, they work..]*
//****************************************************************************
// TAB BAR
//****************************************************************************
$this->add(array(
'type' => 'Zend\Form\Element\Collection',
'name' => 'idBar',
'options' => array(
// 'tab' => 'multiple',
'label' => 'add a bar',
'count' => 0,
'allow_remove' => true,
'allow_add' => true,
'target_element' => new BarFieldset($entityManager, $userNumeroOrga),
)
));
$this->get('idBar')->setHydrator(new DoctrineHydratorDateTimeFr($entityManager));

BarFieldset

*[..HERE: Some Elements, they work..]*
$this->add(array(
'type' => 'Zend\Form\Element\Collection',
'name' => 'idATypeBars',
'options' => array(
'tab' => 'Bar',
'label' => 'add a TypeBar',
'count' => 1,
'allow_remove' => true,
'allow_add' => true,
'target_element' => new TypeBarFieldset($entityManager),
)
));

контроллер
FooController

    $request = $this->getRequest();
$idFoo = (int) $this->params()->fromRoute('id', 0);
if ($request->isPost()) {
$idFoo = $this->params()->fromPost('idFoo');
}

$taFoo = $this->getEntityManager()->find('\Application\Entity\TaFoo', $idFoo);
$form = new FooForm($this->getEntityManager(), $this->getUserNum());
$form->bind($taFoo);

if ($request->isPost()) {

$post = $request->getPost();

$config = $this->getServiceLocator()->get('config');
$fieldset = $config['fieldset'];

$form->setData($post);

if ($form->isValid()) {

$this->getEntityManager()->persist($taFoo);
$this->getEntityManager()->flush();

echo ('ok');
exit();
}

echo '-1: ';
print_r($form->getMessages());
exit();

Я уже проверил, верны ли данные в $ request-> getPost, и все в порядке. Все данные для сохранения TaFoo / TaBar / AtypeBar / TaTypeBar находятся. Но персистент не работает с TaTypeBar.

0

Решение

Вам нужно инициализировать все ваши коллекции в вашем классе сущности __construct методы.

Я думаю, что проблема заключается в том, потому что я не вижу никакой инициализации вашего $this->idATypeBars в вашем TaBar юридическое лицо.

Так что добавьте __construct функционировать так:

public function __construct(){
$this->idATypeBars = new ArrayCollection();
}

Также проверьте конструкторы других ваших сущностей. Это определенно вызовет проблемы.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]