Foros del Web » Programando para Internet » PHP » Symfony »

[SOLUCIONADO] Cómo funciona ArrayCollectio

Estas en el tema de Cómo funciona ArrayCollectio en el foro de Symfony en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 01/09/2013, 10:11
 
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!!!
  #2 (permalink)  
Antiguo 04/09/2013, 08:29
Avatar de lisandro Arg  
Fecha de Ingreso: octubre-2003
Ubicación: Cordoba, Argentina
Mensajes: 945
Antigüedad: 20 años, 6 meses
Puntos: 24
Respuesta: Cómo funciona ArrayCollectio

Hola alex, no soy experto asi que no te puedo dar una solucion pero si te puedo decir lo q haria yo, espero te sirva mi comentario.

Lo primer que haria seria asegurarme que las entidades esten bien, me parece que tienes un oneToMany donde deberia ser ManyToMany (entiendo que los modulos son parte de un curso que pueden toma muchos alumnos) por eso te recomendaria que leas este muy buen post sobre el tama http://showmethecode.es/php/doctrine...as-relaciones/

Una vez que estoy seguro o casi de que esta bien para probar lo haria manualente, para descartar todo lo que pueda hacer mal con el form, seria algo como:


Código PHP:
Ver original
  1. $modulos = $this->getDoctrine()->getRepository('AcmeDemoBundle:Modulo')->findByCodModulo($arrayModulos);
  2. $matricula = new Matricula();
  3. ...
  4. $matricula->setModulos($modulos);
  5. $em->persist($matricula);
  6. $em->flush();

Despues de eso para el form hay otro post en el mismo blog http://showmethecode.es/php/symfony/...on-relaciones/ , el ejemplo seria el de user y address

Que te parece?
  #3 (permalink)  
Antiguo 09/09/2013, 03:13
 
Fecha de Ingreso: septiembre-2013
Mensajes: 3
Antigüedad: 10 años, 8 meses
Puntos: 0
Respuesta: Cómo funciona ArrayCollectio

Muchas gracias por la informacion porque necesitaba algo q me lo explicara, he estado haciendo el YML, no se si terminara estando bien o no...

Código:
Acme\DemoBundle\Entity\Matricula:
    type: entity
    table: matricula
    fields:
        id:
            codCurso:
                associationKey: true
            codAlumno:
                associationKey: true
            codModulo:
                associationKey: true            



    oneToOne:
        codAlumno:
            targetEntity: Alumno
            joinColumns:
                cod_alumno:
                    referencedColumName: id
            orphanRemoval: false            
            
    manyToOne:
        codCurso:
            targetEntity: Curso
            joinColumns:
                cod_curso:
                    referencedColumName: id
            orphanRemoval: false



    manyToMany:
        codModulo:
            targetEntity: Modulo
            joinColumns:
                cod_modulo:
                    referencedColumnName: id
            orphanRemoval: false
                  
    lifecycleCallbacks: {  }
Mas o menos, seria, 1 alumno solo puede tener una matricula, una matricula solo puede tener un curso, pero un curso puede estar en muchas matriculas y una matricula puede tener muchos modulos y un modulo puede estar en muchas matriculas, no se si estaria bien hecho el codigo lo he seguido por los links q me pasaste.

A la hora de hacer la inserccion manual como me comentaste, me da este error:

An exception occurred while executing 'INSERT INTO matricula_modulo (matricula_id, modulo_id) VALUES (?, ?)' with params [6, 41]:

SQLSTATE[42S02]: Base table or view not found: 1146 Table 'Masters.matricula_modulo' doesn't exist

La verdad es que no se por donde coger este error, porque habla de una tabla pero yo la inserto en la de Matricula en ninguna otra mas utilice este codigo mas o menos es lo mismo que me pusiste tu.

$modulos = $this->getDoctrine()->getRepository('AcmeDemoBundle:Modulo')->findAll();
$matricula = new Matricula();
$codCurso= $this->getDoctrine()->getRepository('AcmeDemoBundle:Curso')->find($id);
$codAlumno=$this->getDoctrine()->getRepository('AcmeDemoBundle:Alumno')->find($id);

$matricula->addCodModulo($modulos[1]);
$matricula->setCodCurso($codCurso);
$matricula->setCodAlumno($codAlumno);
$em->persist($matricula);
$em->flush();

A ver si sabes mas o menos por donde va el error.

Y muchisimas gracias Lisandro porqe la informacion me ha servido de bastante.
  #4 (permalink)  
Antiguo 09/09/2013, 06:59
Avatar de lisandro Arg  
Fecha de Ingreso: octubre-2003
Ubicación: Cordoba, Argentina
Mensajes: 945
Antigüedad: 20 años, 6 meses
Puntos: 24
Respuesta: Cómo funciona ArrayCollectio

Crea esa tabla, el orm la usa para manejar la relacion ManyToMany que tienes
  #5 (permalink)  
Antiguo 10/09/2013, 11:00
 
Fecha de Ingreso: septiembre-2013
Mensajes: 3
Antigüedad: 10 años, 8 meses
Puntos: 0
Respuesta: Cómo funciona ArrayCollectio

Muchisimas gracias Lisandro ya esta todo arreglado

Gracias de nuevo!
  #6 (permalink)  
Antiguo 11/09/2013, 07:37
Avatar de lisandro Arg  
Fecha de Ingreso: octubre-2003
Ubicación: Cordoba, Argentina
Mensajes: 945
Antigüedad: 20 años, 6 meses
Puntos: 24
Respuesta: Cómo funciona ArrayCollectio

Excelente!, muy buena noticia :), exitos!

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:30.