Ver Mensaje Individual
  #1 (permalink)  
Antiguo 01/09/2013, 10:11
alexhiglesias
 
Fecha de Ingreso: septiembre-2013
Mensajes: 3
Antigüedad: 10 años, 8 meses
Puntos: 0
Cómo funciona ArrayCollectio

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