Мне нужна помощь, я работаю над 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.
Thx для вашего ответа, я добавил все ArrayCollection() в конструкцию, но всегда та же проблема. Этот код (три объекта с несколькими точками и onetomany) является ошибкой, когда вы получаете сущности из базы данных с командной строкой. Это многоголосый. Я делаю некоторые тесты, и все в порядке, поэтому, когда я использую manytomany на своих сущностях, я отредактирую свой вопрос. ;) – Kearitt
@Kearitt Используете ли вы какой-либо [валидатор доктрины для ваших сопоставлений] (http://doctrine-orm.readthedocs.org/en/latest/reference/tools.html#runtime-vs-development-mapping-validation)? Похоже, ваша проблема может быть в некоторых недопустимых ассоциациях. Один из примеров, который я вижу, заключается в том, что в '' idTypeBar' в 'ATypeBar' нет' inversedBy'. Валидатор поможет вам правильно разобраться. У меня на самом деле никогда не было проблем с отношениями «ManyToOne» и «OneToMany». – Wilt
Нет, мы используем обратную инженерию. И этот метод не создает (с базой данных оракула) manytomany. В других проектах мы будем использовать Validator и генерировать базу данных из объектов. Будет лучше. – Kearitt