2014-10-21 2 views
0

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

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

  • TaFoo является создание и сохранение
  • табар также создавать и сохранять
  • 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

Вам необходимо, чтобы initialize all your collections в вашем классе объектов __construct методов.

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

Так добавить __construct функцию следующим образом:

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

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

+0

Thx для вашего ответа, я добавил все ArrayCollection() в конструкцию, но всегда та же проблема. Этот код (три объекта с несколькими точками и onetomany) является ошибкой, когда вы получаете сущности из базы данных с командной строкой. Это многоголосый. Я делаю некоторые тесты, и все в порядке, поэтому, когда я использую manytomany на своих сущностях, я отредактирую свой вопрос. ;) – Kearitt

+0

@Kearitt Используете ли вы какой-либо [валидатор доктрины для ваших сопоставлений] (http://doctrine-orm.readthedocs.org/en/latest/reference/tools.html#runtime-vs-development-mapping-validation)? Похоже, ваша проблема может быть в некоторых недопустимых ассоциациях. Один из примеров, который я вижу, заключается в том, что в '' idTypeBar' в 'ATypeBar' нет' inversedBy'. Валидатор поможет вам правильно разобраться. У меня на самом деле никогда не было проблем с отношениями «ManyToOne» и «OneToMany». – Wilt

+0

Нет, мы используем обратную инженерию. И этот метод не создает (с базой данных оракула) manytomany. В других проектах мы будем использовать Validator и генерировать базу данных из объектов. Будет лучше. – Kearitt

Смежные вопросы