2

I have no problem to persist from ManytoMany(normal) and ManytoOne, however, I don't understand the proper way to persist entity from OnetoMany and ManytoMany(Reversed).

Here is an example :

ExampleEntity :

...
/**
 * @var ArrayCollection $myentities
 *
 * @ORM\OneToMany(targetEntity="AppBundle\Entity\Myentity", mappedBy="exampleentity", cascade={"persist"})
 */
private $myentities;

// getters/setters
/*
public function addMyentity(Myentity $myentitie)
public function removeMyentity(Myentity $myentitie)
public function getMyentities()
public function setMyentities(ArrayCollection $myentities)
*/
...

Form :

...
->add('myentities', 'Symfony\Bridge\Doctrine\Form\Type\EntityType', array(
    'class'         => 'AppBundle\Entity\Myentity',
    'multiple'    => true
))
...

Controller :

...
if ($form->handleRequest($request)->isValid()) {
        $em = $this->getDoctrine()->getManager();
        $em->persist($exampleentity);
        $em->flush();
    }
}
...

So here is the problem, add and remove function are never called, so all "$myentities" are never persist correcly.

I try to update my form with "by_reference => false" but it is not documented for EntityType (and also create other errors).

I try to change my controller but during edit how detect which one have been select (easy) and which ones have been unselected (not easy or not optimised) ?

Doctrine is not supposed to simplify theses kind of tasks ?

0

2 Answers 2

1

Solution in case anyone stumbles upon this same problem:

You need to have proper setters/getters:

class MyEntity
{
    /**
     * @var Groupe[]|ArrayCollection
     *
     * @ORM\OneToMany(targetEntity="Groupe", mappedBy="otherEntity")
     */
    protected $notifyGroupsOnNewMail;

    public function addNotifyGroupsOnNewMail(Groupe $notifyGroupsOnNewMail): self
    {
        if (!$this->notifyGroupsOnNewMail->contains($notifyGroupsOnNewMail))
        {
            $this->notifyGroupsOnNewMail[] = $notifyGroupsOnNewMail;
            $notifyGroupsOnNewMail->setMyEntity($this);
        }

        return $this;
    }

    public function removeNotifyGroupsOnNewMail(Groupe $notifyGroupsOnNewMail): self
    {
        if ($this->notifyGroupsOnNewMail->contains($notifyGroupsOnNewMail))
        {
            $this->notifyGroupsOnNewMail->removeElement($notifyGroupsOnNewMail);
            // set the owning side to null (unless already changed)
            if ($notifyGroupsOnNewMail->getMyEntity() === $this)
            {
                $notifyGroupsOnNewMail->setMyEntity(null);
            }
        }

        return $this;
    }
}

But also have 'by_reference' => false in your form, otherwise your setters are not called, and therefore trying to persist from the reverse side will not save anything:

            ->add('notifyGroupsOnNewMail', EntityType::class, [
                'class'    => Groupe::class,
                'required' => false,
                'multiple' => true,
                'by_reference' => false
            ])
Sign up to request clarification or add additional context in comments.

Comments

0

Did you check if during the post request, added child elements has been sent to the server? If you are using form prototype, maybe you have to check input index.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.