Tengo un pequeño gran problema al guardar un tipo ArrayCollection en la BD con Doctrine. La logica es muy simple, una persona puede tener muchas suscripciones, por lo tanto la relacion crea una nueva tabla que se llama suscripcionxpersona en donde se guardara el ID de la persona y los ID de las suscripciones que el desee, obviamente el ID de la persona lo saco de la sesion que el posea, aqui dejo el codigo
Tabla Suscripciones:
Código HTML:
Ver original
class Suscripciones { /** * @var integer * * @ORM\Column(name="id", type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") */ protected $id; /** * @var string * * @ORM\Column(name="Snombre", type="string", length=255) * @Assert\NotNull(message="errores.NotNull") * @Assert\Length(min = "1", max = "255", minMessage="errores.length.minMessage", maxMessage="errores.length.maxMessage") */ protected $sNombre; public function __toString() { return $this->getSNombre(); } /** * @ORM\OneToMany(targetEntity="SuscripcionXcandidato", mappedBy="sxcsuscripcionid") */ protected $suscripcionxcandidato; public function __construct() { $this->suscripcionxcandidato = new \Doctrine\Common\Collections\ArrayCollection(); } //getter y setter de nombre y el getter de id /** * Add suscripcionxcandidato * * @param \Acme\PruebaBundle\Entity\SuscripcionXcandidato $suscripcionxcandidato * @return Suscripciones */ public function addSuscripcionxcandidato(\Acme\PruebaBundle\Entity\SuscripcionXcandidato $suscripcionxcandidato) { $this->suscripcionxcandidato[] = $suscripcionxcandidato; return $this; } /** * Remove suscripcionxcandidato * * @param \Acme\PruebaBundle\Entity\SuscripcionXcandidato $suscripcionxcandidato */ public function removeSuscripcionxcandidato(\Acme\PruebaBundle\Entity\SuscripcionXcandidato $suscripcionxcandidato) { $this->suscripcionxcandidato->removeElement($suscripcionxcandidato); } /** * Get suscripcionxcandidato * * @return \Doctrine\Common\Collections\Collection */ public function getSuscripcionxcandidato() { return $this->suscripcionxcandidato; } }
Tabla suscripcionesxpersona:
Código HTML:
Ver original
class SuscripcionXcandidato { /** * @var integer * * @ORM\Column(name="id", type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") */ protected $id; /** * @ORM\ManyToOne(targetEntity="Candidato", inversedBy="suscripcionxcandidato") * @ORM\JoinColumn(name="sxcid", referencedColumnName="id") */ protected $sxcid; /** * @ORM\ManyToOne(targetEntity="Suscripciones", inversedBy="suscripcionxcandidato") * @ORM\JoinColumn(name="SXCsuscripcionID", referencedColumnName="id") */ protected $sxcsuscripcionid; /** * Get id * * @return integer */ public function getId() { return $this->id; } /** * Set sxcid * * @param \Acme\PruebaBundle\Entity\Candidato $sxcid * @return SuscripcionXcandidato */ public function setSxcid(\Acme\PruebaBundle\Entity\Candidato $sxcid = null) { $this->sxcid = $sxcid; return $this; } /** * Get sxcid * * @return \Acme\PruebaBundle\Entity\Candidato */ public function getSxcid() { return $this->sxcid; } /** * Set sxcsuscripcionid * * @param \Acme\PruebaBundle\Entity\Suscripciones $sxcsuscripcionid * @return SuscripcionXcandidato */ public function setSxcsuscripcionid(\Acme\PruebaBundle\Entity\Suscripciones $sxcsuscripcionid = null) { $this->sxcsuscripcionid = $sxcsuscripcionid; return $this; } /** * Get sxcsuscripcionid * * @return \Acme\PruebaBundle\Entity\Suscripciones */ public function getSxcsuscripcionid() { return $this->sxcsuscripcionid; } public function __construct() { $this->sxcsuscripcionid = new \Doctrine\Common\Collections\ArrayCollection(); } }
El formulario Type (SuscripcionXcandidatoType) donde cargo el formulario:
Código HTML:
Ver original
class SuscripcionXcandidatoType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder->add('sxcsuscripcionid', 'entity', array( 'class' => 'AcmePruebaBundle:Suscripciones', 'label' => ' ', 'expanded' => true, 'multiple' => true, 'required' => false, 'attr' => array('class' => 'div_cvSuscripciones_checkbox'), 'query_builder' => function(EntityRepository $er) { return $er ->createQueryBuilder('s') ->where('s.sestado = 1 AND s.stipoid = 1') ->orderBy('s.sorden', 'ASC'); } ) ); } public function setDefaultOptions(OptionsResolverInterface $resolver) { $resolver->setDefaults(array( 'data_class' => 'Acme\PruebaBundle\Entity\SuscripcionXcandidato', // una clave única para ayudar generar la ficha secreta 'intention' => 'task_item', )); } public function getName() { return 'an_candidato_suscripcionxcandidato'; } }
Y el controller:
Código HTML:
Ver original
public function cvSuscripcionesAction() { $entity = new SuscripcionXcandidato(); //Creamos el Formulario $form = $this->createForm(new SuscripcionXcandidatoType(), $entity); //Variables que se ocupan en algunos casos $request = $this->getRequest(); //Si se envio, verificamos, si no, seteamos un formulario nuevo if($request->getMethod() === 'POST') { $form->bind($request); //Si el formulario es valido, y no contiene errores, ingresamos if ($form->isValid()) { //Agregamos las suscripciones seleccionadas foreach ($entity->getSxcsuscripcionid() as $suscripcion) { $suscripcion->addSuscripcionxcandidato($entity); } $em->persist($entity); $em->flush(); //redireccion } }
Me carga los respectivos checkbox donde puedo seleccionar lo que quiero, pero al momento de guardarlos me tira un lindo error :D
Código HTML:
Ver original
Found entity of type Doctrine\Common\Collections\ArrayCollection on association Acme\PruebaBundle\Entity\SuscripcionXcandidato#sxcsuscripcionid, but expecting Acme\PruebaBundle\Entity\Suscripciones
He buscado info, pero no he podido resolverlo, hay algo que estoy haciendo mal al guardar pero no logro pillar que