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 !
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!