Search code examples
symfonydoctrineentitysymfony-forms

Doctrine association error when persisting a Symfony form entity in Symfony 2.3


Found entity of type on association but expected Form validation, Persist

**I TRY: **

On Sf2.3, I trying to modify my object from a form. Create works fine but the modification not.

**I HAVE: **

My entitiy procedureMadridNice:

class procedureMadridNice
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity="PIM\BrevetBundle\Entity\procedurebrevet", inversedBy="madridnices")
     * @ORM\JoinColumn(nullable=true)
     */
    private $procedure;

    /**
     * @ORM\OneToOne(targetEntity="PIM\BrevetBundle\Entity\annuite", inversedBy="annuite_nice")
     * @ORM\JoinColumn(nullable=true, name="annuite_id", referencedColumnName="id")
     */
    private $annuite;

    /**
     * @ORM\OneToMany(targetEntity="PIM\BrevetBundle\Entity\procedureNice", mappedBy="procedure", cascade={"remove", "persist"}, orphanRemoval=true)
     */
    private $nices;

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

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

    /**
     * Set procedure
     *
     * @param procedurebrevet $procedure
     * @return procedureMadridNice
     */
    public function setProcedure(procedurebrevet $procedure = null)
    {
        $this->procedure = $procedure;

        return $this;
    }

    /**
     * Get procedure
     *
     * @return procedurebrevet
     */
    public function getProcedure()
    {
        return $this->procedure;
    }

    /**
     * Set annuite
     *
     * @param annuite $annuite
     * @return procedureMadridNice
     */
    public function setAnnuite(annuite $annuite)
    {
        $this->annuite = $annuite;

        return $this;
    }

    /**
     * Get annuite
     *
     * @return annuite
     */
    public function getAnnuite()
    {
        return $this->annuite;
    }

    /**
     * Get nices
     *
     * @return Collection
     */
    public function getNices()
    {
        return $this->nices;
    }


    /**
     * Add nice
     *
     * @param procedureNice $nice
     * @return procedureMadridNice
     */
    public function addNice(procedureNice $nice)
    {
        $this->nices[] = $nice;
        $nice->setProcedure($this);

        return $this;
    }

    /**
     * Remove nice
     *
     * @param procedureNice $nice
     */
    public function removeNice(procedureNice $nice)
    {
        $this->nices->removeElement($nice);
    }


}

and this one procedureNice

/**
 * procedureNice
 *
 * @ORM\Table("procedure_nice")
 * @ORM\Entity(repositoryClass="PIM\BrevetBundle\Entity\procedureNiceRepository")
 */
class procedureNice
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity="PIM\BrevetBundle\Entity\procedureMadridNice", inversedBy="nices")
     * @ORM\JoinColumn(nullable=true)
     */
    private $procedure;

    /**
     * @ORM\ManyToOne(targetEntity="PIM\BrevetBundle\Entity\classeNice", inversedBy="procnice")
     * @ORM\JoinColumn(nullable=true)
     */
    private $nice;

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

    /**
     * Set procedure (il s'agit ici de procedureMadridNice et non procedurebrevet !)
     *
     * @param procedureMadridNice $procedure
     * @return procedureNice
     */
    public function setProcedure(procedureMadridNice $procedure = null)
    {
        $this->procedure = $procedure;

        return $this;
    }

    /**
     * Get procedure
     *
     * @return procedureNice
     */
    public function getProcedure()
    {
        return $this->procedure;
    }

    /**
     * Set nice
     *
     * @param classeNice $nice
     * @return procedureNice
     */
    public function setNice(classeNice $nice = null)
    {
        $this->nice = $nice;

        return $this;
    }

    /**
     * Get nice
     *
     * @return classeNice
     */
    public function getNice()
    {
        return $this->nice;
    }
}


and this one:

/**
 * classeNice
 *
 * @ORM\Table("classe_nice")
 * @ORM\Entity(repositoryClass="PIM\BrevetBundle\Entity\classeNiceRepository")
 */
class classeNice
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="classe", type="string", length=255)
     */
    private $classe;

    /**
     * @var string
     *
     * @Gedmo\Translatable
     * @ORM\Column(name="name", type="string", length=255)
     */
    private $name;

    /**
     * @ORM\OneToMany(targetEntity="PIM\BrevetBundle\Entity\familleClasseNice", mappedBy="classenice", cascade={"remove", "persist"}, orphanRemoval=true)
     */
    private $famille;

    /**
     * @ORM\OneToMany(targetEntity="PIM\BrevetBundle\Entity\procedureNice", mappedBy="nice", cascade={"remove", "persist"}, orphanRemoval=true)
     */
    private $procnice;

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

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

    /**
     * Set classe
     *
     * @param string $classe
     * @return classeNice
     */
    public function setClasse($classe)
    {
        $this->classe = $classe;

        return $this;
    }

    /**
     * Get classe
     *
     * @return string 
     */
    public function getClasse()
    {
        return $this->classe;
    }

    /**
     * Set name
     *
     * @param string $name
     * @return classeNice
     */
    public function setName($name)
    {
        $this->name = $name;

        return $this;
    }

    /**
     * Get name
     *
     * @return string 
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * Add famille
     *
     * @param familleClasseNice $famille
     * @return classeNice
     */
    public function addFamille(familleClasseNice $famille)
    {
        $this->famille[] = $famille;

        return $this;
    }

    /**
     * Remove famille
     *
     * @param familleClasseNice $famille
     */
    public function removeFamille(familleClasseNice $famille)
    {
        $this->famille->removeElement($famille);
    }

    /**
     * Get famille
     *
     * @return Collection
     */
    public function getFamille()
    {
        return $this->famille;
    }

    /**
     * @return string
     */
    public function getFullName()
    {
        return $this->getClasse().' - '.$this->getName();
    }

    /**
     * Add procnice
     *
     * @param procedureNice $procnice
     * @return classeNice
     */
    public function addProcnice(procedureNice $procnice)
    {
        $this->procnice[] = $procnice;

        return $this;
    }

    /**
     * Remove procnice
     *
     * @param procedureNice $procnice
     */
    public function removeProcnice(procedureNice $procnice)
    {
        $this->procnice->removeElement($procnice);
    }

    /**
     * Get procnice
     *
     * @return Collection
     */
    public function getProcnice()
    {
        return $this->procnice;
    }

    public function __toString() {
        return $this->name;
    }

}


Now, my form which modify my object:

class procedureMadridNiceType extends AbstractType
{

    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {

        $builder
            ->add('nices','collection',array(
                'type' => new niceType(),
                'allow_add' => true,
                'allow_delete' =>true,
                'by_reference' =>false,
                'label' => 'Classes de Nice'
            ));

    }

    /**
     * @param OptionsResolverInterface $resolver
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'PIM\BrevetBundle\Entity\procedureMadridNice'
        ));
    }

    /**
     * @return string
     */
    public function getName()
    {
        return 'pim_brevetbundle_proceduremadridnice';
    }

}

**WHEN I TRY: **

and to finish, my controller where I try to modify my object. The form shows the rights information even If I modify manually some records directly on the database.


    public function madridupAction($id = 0, $type, famille $famille, $cc = null)
    {
        $request = $this->get('request');

        /** @var procedurebrevet $procedureBrevet */
        $procedureBrevet = $this->getDoctrine()->getRepository('PIMBrevetBundle:procedurebrevet')->findOneBy(array('id' => $id));

        // Comme on a le pays en iso text, il nous faut l'objet, par exemple FR => obj(69)
        /** @var annuite $annuite */
        $annuite = $this->getDoctrine()->getRepository('PIMBrevetBundle:annuite')->findOneBy(array('pays' => $cc));

        /** @var procedureMadridNice $procedureMadrid */
        $procedureMadrid = $this->getDoctrine()->getRepository('PIMBrevetBundle:procedureMadridNice')->findOneBy(
            array(
                'procedure' => $id,
                'annuite' => $annuite
            ));

...
...
        $form = $this->createForm(new procedureMadridNiceType(), $procedureMadrid);

        $form->handleRequest($request);
        if ($form->isSubmitted() && $form->isValid()) {

            $em = $this->getDoctrine()->getManager();
            $em->persist($procedureMadrid);  <== BUG HERE
            $em->flush();

            return $this->redirect($this->generateUrl($this->routevalidform, array('famille' => $famille->getId())));
        }

        return $this->render($this->bundlename . ':' . $this->folder . ':' . $this->fileMadridCCForm,
            array(
                'item' => $procedureMadrid,
                'form' => $form->createView(),
                'type' => $type,
                'famille' => $famille,
            )
        );
    }

ERROR I OBTAIN:

On the persist $em->persist($procedureMadrid);, I get the error below:

Found entity of type PIM\BrevetBundle\Entity\procedureMadridNice on association PIM\BrevetBundle\Entity\annuite#annuite_nice, but expecting PIM\BrevetBundle\Entity\AnnuiteNice

Help are welcome !


Solution

  • I found the problem, in my entity ProcedureMadridNice, property "annuite" was linked to "annuite_nice" (inversedBy in "annuite" entity) and it seems it was not possible because another entity was also linked to annuite_nice, so in the "annuite" entity, I created a "annuite_madrid_nice" property. Now it works fine!