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

Generando DB Queries innecesarios en campo Etity

Estas en el tema de Generando DB Queries innecesarios en campo Etity en el foro de Symfony en Foros del Web. Hola comunidad, tiempo sin molestarlos :P Más que problema es una duda en Symfony2.4, con respecto a los campos "Entity" o "selects" que se alimentan ...
  #1 (permalink)  
Antiguo 24/03/2014, 19:25
 
Fecha de Ingreso: febrero-2014
Ubicación: Edo. México
Mensajes: 85
Antigüedad: 10 años, 2 meses
Puntos: 0
Generando DB Queries innecesarios en campo Etity

Hola comunidad, tiempo sin molestarlos :P

Más que problema es una duda en Symfony2.4, con respecto a los campos "Entity" o "selects" que se alimentan de una BD y formularios embebidos.
Tengo un formulario que tiene embebido otro formulario que a su vez tienen 3 campos "Entity" que me generan un select con las opciones de la BD. Para explicar mejor mi duda inserto una imagen de cómo queda este formulario:

Como pueden observar con solo cuatro formularios embebidos genero un total de 32 DB Queries. Esto debido a que por cada campo "Entity" me genera de 1 a 3 consultas para obtener las opciones y si agrego otro formulario mediante el botón "Agregar" se suman otras 6 DB Queries.

Se me ocurrió pasar un objeto que contuviera todas las Entidades que ocupo en los FormType, algo así

Código PHP:
$TorneoRol $em->getRepository('FutbolMainBundle:Torneos')->getJoinnEntidades($id,$Cliente_id);
$editForm $this->createForm(new TorneoType(), $TorneoRol, array('ClienteID' => $Cliente_id,'idToreno' =>$id,'Torneo'=>$TorneoRol)); 
Y posteriormente ocuparlas en los repocitorios de los "Entity" así:
Código PHP:
//FormType
$Torneo =$options['Torneo'];
        
$builder
                
->add('idInscripcionequipo''entity', array(
                
'class' => 'FutbolMainBundle:Inscripcionequipo',   
                
'property' => 'idEquipo'
                
'empty_value' => '**Selecciona un Equipo**',
                
'query_builder' => function(FutbolMainBundleRepositoryInscripcionequiposRepository $em) use ($idCliente,$idToreno,$Torneo)  {
                        return 
$em->getEquipos($idCliente,$idToreno,$Torneo); }, 
                                                      ));

// Repositorio Inscripcioneqipo
public function getEquipos($idCliente,$idToreno,$Torneo)
{
    return 
$this->createQueryBuilder('ins')  
        ->
Join('ins.idEquipo''e')
        ->
leftJoin('ins.idTorneo''t')
        ->
Join('ins.PIExy''pie')
        ->
Join('pie.idPartido''p')
        ->
where('ins.idCliente = :company')
        ->
andWhere('ins.idTorneo = :torneo')
        ->
setParameters(array ('company' => $idCliente,
                               
'torneo' => $Torneo))
        ->
orderBy('e.nombre''ASC');

Pero nop, me sigue marcando la misma cantidad de Queries

Alguien sabe algo al respecto que me pueda orientar un poco?
  #2 (permalink)  
Antiguo 25/03/2014, 13:45
 
Fecha de Ingreso: febrero-2014
Ubicación: Edo. México
Mensajes: 85
Antigüedad: 10 años, 2 meses
Puntos: 0
Respuesta: Generando DB Queries innecesarios en campo Etity

Hola he notado que en los FormType si quito el 'query_builder' deja de generar un query por cada formulario embebido y me genera solo 1.
Código PHP:
 $builder->add('idLugar''entity', array(
                
'class' => 'FutbolMainBundle:Lugar',   
                
'property' => 'nombreCampo',                    
                
'label' => 'Lugar',                
                
'empty_value' => '',
//                'query_builder' => function(\Futbol\MainBundle\Repository\LugarRepository $em) use ($idCliente,$Torneo)  {
//                        return $em->getLugares_X_ClienteQueryBuilder($idCliente,$Torneo); }, 
                
)) 
Pero de esta forma no me genera el filtro de los datos deseado:
Dejo aquí el repositorio
Código PHP:
public function getLugares_X_ClienteQueryBuilder($idCliente,$Torneo){
    return 
$this->createQueryBuilder('l')
        ->
Join('l.partidosxy''p')   
        ->
where('l.idCliente = :company')
        ->
setParameter('company'$idCliente)
        ->
orderBy('l.nombrecampo''ASC');   

  #3 (permalink)  
Antiguo 25/03/2014, 14:00
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Generando DB Queries innecesarios en campo Etity

Es lo normal, por cada select tira una query, para que no lo haga deberias utilizar el cache, de todas formas lo normal es evitar justamente lo que estas haciendo, y simplemente separarlo en diferentes acciones
__________________
http://es.phptherightway.com/
thats us riders :)
  #4 (permalink)  
Antiguo 25/03/2014, 15:53
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 9 meses
Puntos: 379
Respuesta: Generando DB Queries innecesarios en campo Etity

Aparte de hacer uso de cache y de separar las acciones, puedes tener value objects o arreglos para alguno de los selects de tu forma y ahorrar consultas a la base de datos. Pero eso es algo que tienes que evaluar.
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #5 (permalink)  
Antiguo 26/03/2014, 12:40
 
Fecha de Ingreso: febrero-2014
Ubicación: Edo. México
Mensajes: 85
Antigüedad: 10 años, 2 meses
Puntos: 0
Respuesta: Generando DB Queries innecesarios en campo Etity

Gracias por sus aportes. Intentare lo que me dicen, si hoy no lo consigo lo reestructurare separando las acciones.

Estuve viendo lo de value objects pero no puede aplicarlo y lo de la cache es un tema algo extenso pero intentare aplicarlo . En cuanto a los arreglos intente hacer esto;

Código PHP:
$Lugar=$em->getRepository('FutbolMainBundle:Lugar')->getLugarByCliente($Cliente_id);

 ->
add('idLugar''entity', array(
                
'class' => 'FutbolMainBundle:Lugar',
                
'choices' => $Lugar,                  
                
'label' => 'Lugar',                
                
'empty_value' => '',
                )) 
Pero no me respeta los filtros de la consulta y me imprime todos los datos
  #6 (permalink)  
Antiguo 26/03/2014, 14:40
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 9 meses
Puntos: 379
Respuesta: Generando DB Queries innecesarios en campo Etity

Cita:
Iniciado por Esdras_mtz Ver Mensaje
Gracias por sus aportes. Intentare lo que me dicen, si hoy no lo consigo lo reestructurare separando las acciones.

Estuve viendo lo de value objects pero no puede aplicarlo y lo de la cache es un tema algo extenso pero intentare aplicarlo . En cuanto a los arreglos intente hacer esto;

Código PHP:
$Lugar=$em->getRepository('FutbolMainBundle:Lugar')->getLugarByCliente($Cliente_id);

 ->
add('idLugar''entity', array(
                
'class' => 'FutbolMainBundle:Lugar',
                
'choices' => $Lugar,                  
                
'label' => 'Lugar',                
                
'empty_value' => '',
                )) 
Pero no me respeta los filtros de la consulta y me imprime todos los datos
Agregas o modificas con frecuencia la entidad Lugar ? es decir si en cada torneo tienes que agregar nuevos lugares o tienes que modificar sus datos de alguna forma durante el torneo. o solo los agregas una vez ?
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #7 (permalink)  
Antiguo 26/03/2014, 16:08
 
Fecha de Ingreso: febrero-2014
Ubicación: Edo. México
Mensajes: 85
Antigüedad: 10 años, 2 meses
Puntos: 0
Respuesta: Generando DB Queries innecesarios en campo Etity

Es posible que en el transcurso del torneo, agreguen, borren o editen, pero muy esporádicamente.
La lógica debería de ser que agreguen todos los lugares donde se juegan los partidos y salvo que se adquiera una nueva cancha o se deshagan de algún campo deportivo, esto no debería cambiar
  #8 (permalink)  
Antiguo 26/03/2014, 18:04
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Generando DB Queries innecesarios en campo Etity

@Esdras_mtz, tal cual lo muestras el select deberia tener lo que traes del repo, a que te refieres con "me muestra todo" ?

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #9 (permalink)  
Antiguo 26/03/2014, 19:40
 
Fecha de Ingreso: febrero-2014
Ubicación: Edo. México
Mensajes: 85
Antigüedad: 10 años, 2 meses
Puntos: 0
Respuesta: Generando DB Queries innecesarios en campo Etity

Código PHP:
public function getLugarByCliente($Cliente_id){
    
$query $this->getEntityManager()->createQuery('
                    Select l,p
                    FROM FutbolMainBundle:Lugar l 
                    WHERE l.Cliente = :id 
                    ORDER BY l.nombrecampo ASC 
                    '
)
                ->
setParameters(array('id' => $Cliente_id));
    return  
$query->getArrayResult();

No me respeta el WHERE. Imprimiendo la variable con var_dump si me aparecen los datos que deberían, pero en el choice no hace caso
  #10 (permalink)  
Antiguo 28/03/2014, 16:46
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 9 meses
Puntos: 379
Respuesta: Generando DB Queries innecesarios en campo Etity

Cita:
Iniciado por Esdras_mtz Ver Mensaje
La lógica debería de ser que agreguen todos los lugares donde se juegan los partidos y salvo que se adquiera una nueva cancha o se deshagan de algún campo deportivo, esto no debería cambiar
Esto podría indicarte que Lugar no necesariamente tenga que ser una entidad, puesto que los campos no cambian con frecuencia. Asi que igual no es necesario persistir Lugar en la base de datos. y por ende no ejecutar un query. Pero como comente el cambio de esto es algo que tienes que evaluar.
Pero de no ser posible vas a tener que ir por el lado de la caché.
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.

Etiquetas: frameworks-y-php-orientado-a-objetos
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 01:55.