Hola, acudo a vosotros porque, la verdad, ya no se como hacer, estoy usando symfony 2, tengo un proyecto para la gestion de alumnos matriculados en Masters, el tema es el siguiente, tengo 3 tablas, 1. es el alumno que tiene todo lo relacionado con el alumno, 2. curso, tiene todo lo relacionado con el curso y 3. modulo que tiene obviamente, todo lo relacionado con el modulo, ahora bien, para hacer una matricula, necesito el id del alumno, el id del curso y el del modulo, esto es facil, el problema viene cuando, se quiere matricular a un mismo alumno, en un mismo curso pero en MUCHOS modulos, se que es con un ArrayCollection() pero es que no tengo ni idea de como funciona esto, he buscado y no se realmente que hay que hacer, os pongo las clases referenciadas:
Controlador:
Código:
class newOptionsController extends Controller {
public function newMatriculaAction(Request $request) {
$em = $this->getDoctrine()->getEntityManager();
$alumnos = $this->getDoctrine()->getRepository('AcmeDemoBundle:Alumno')->findAll();
$defecto = 0;
if ($request->query->get('idcurso') == null) {
$query = $em->createQuery('SELECT u FROM AcmeDemoBundle:Especialidad u ');
} else {
$defecto = $request->query->get('idcurso');
$sql = $this->getDoctrine()->getRepository('AcmeDemoBundle:Curso')->find($defecto);
$query = $em->createQuery('SELECT u FROM AcmeDemoBundle:Especialidad u WHERE u.codCurso=' . $request->query->get('idcurso'));
}
$modulos = $query->getResult();
$request = $this->getRequest();
$matricula = new Matricula();
$form = $this->createFormBuilder($matricula)
->add('codAlumno', 'entity', array(
'class' => 'AcmeDemoBundle:Alumno',
'empty_value' => '-',
'expanded' => false,
'multiple' => false,
'property' => 'nombre'
))
->add('codCurso', 'entity', array(
'class' => 'AcmeDemoBundle:Curso',
'expanded' => false,
'multiple' => false,
'property' => 'titulo'
))
->add('codModulo', 'entity', array(
'class' => 'AcmeDemoBundle:Modulo',
'empty_value' => '-',
'required' => true,
'expanded' => true,
'multiple' => true,
'property' => 'nombre'
))
->getForm();
if ($request->getMethod() == 'POST') {
$form->bind($request);
if ($form->isValid()) {
try {
$data = $form->getData();
$sql = $this->getDoctrine()->getRepository('AcmeDemoBundle:Matricula')->findByCodAlumno($data->getCodAlumno());
// $sql="select c from AcmeDemoBundle:Matricula c where c.codAlumno =". $data->getCodAlumno()." and c.codCurso =".$data->getCodCurso()."";
if ($sql != NULL && count($sql) > 0) {
$this->get('session')->getFlashBag()->add('notice', 'Este alumno ya está matriculado!');
return $this->redirect('newMatricula');
}
if ($data->getCodAlumno() == NULL || $data->getCodCurso() == NULL) {
$this->get('session')->getFlashBag()->add('notice', 'Debe rellenar TODOS los campos!');
return $this->redirect('newMatricula');
}
$em = $this->getDoctrine()->getManager();
$em->persist($data);
$em->flush();
return $this->redirect('newMatricula');
} catch (Exception $ex) {
$response = new Response('error');
return $response;
}
}
}
return $this->render('AcmeDemoBundle:NewOptions:newMatricula.html.twig', array('form' => $form->createView(), 'alumnos' => $alumnos, 'modulos' => $modulos));
}
}
Entity:
Código:
<?php
namespace Acme\DemoBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Matricula
*/
class Matricula
{
/**
* @var integer
*/
private $codCurso;
/**
* @var integer
*/
private $codModulo;
/**
* @var integer
*/
private $codAlumno;
/**
* Constructor
*/
public function __construct()
{
$this->codModulo = new \Doctrine\Common\Collections\ArrayCollection();
}
/**
* Set codCurso
*
* @param integer $codCurso
* @return Matricula
*/
public function setCodCurso($codCurso)
{
$this->codCurso = $codCurso;
return $this;
}
/**
* Get codCurso
*
* @return integer
*/
public function getCodCurso()
{
return $this->codCurso;
}
/**
* Set codModulo
*
* @param integer $codModulo
* @return Matricula
*/
public function setCodModulo($codModulo)
{
$this->codModulo = $codModulo;
return $this;
}
/**
* Get codModulo
*
* @return integer
*/
public function getCodModulo()
{
return $this->codModulo;
}
/**
* Set codAlumno
*
* @param integer $codAlumno
* @return Matricula
*/
public function setCodAlumno($codAlumno)
{
$this->codAlumno = $codAlumno;
return $this;
}
/**
* Get codAlumno
*
* @return integer
*/
public function getCodAlumno()
{
return $this->codAlumno;
}
}
ORM Maricula:
Código:
Acme\DemoBundle\Entity\Matricula:
type: entity
table: matricula
id:
codCurso:
associationKey: true
codAlumno:
associationKey: true
codModulo:
associationKey: true
oneToOne:
codCurso:
targetEntity: Curso
cascade: {}
mappedBy: null
inversedBy: null
joinColumns:
cod_curso:
referencedColumnName: id_curso
orphanRemoval: false
codAlumno:
targetEntity: Alumno
cascade: {}
mappedBy: null
inversedBy: null
joinColumns:
cod_alumno:
referencedColumnName: id_alumno
orphanRemoval: false
oneToMany:
codModulo:
targetEntity: Modulo
cascade: ["persist"]
mappedBy: matricula
lifecycleCallbacks: { }
a ver si me podeis dar una solución, o explicarme como usar el ArrayCollection en este caso, porque llevo 2 semanas con ello y por mas que intento, no doy con nada.
Muchas gracias!!!