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

Problema Consulta con JOIN

Estas en el tema de Problema Consulta con JOIN en el foro de Symfony en Foros del Web. Hola. Tengo una duda en una consulta con JOINS, debería devolver 2 resultados y sin embargo devuelve 4... No lo entiendo, si la pruebo en ...
  #1 (permalink)  
Antiguo 09/05/2016, 09:01
 
Fecha de Ingreso: marzo-2007
Mensajes: 59
Antigüedad: 17 años, 1 mes
Puntos: 0
Pregunta Problema Consulta con JOIN

Hola.
Tengo una duda en una consulta con JOINS, debería devolver 2 resultados y sin embargo devuelve 4...

No lo entiendo, si la pruebo en MySQL funciona bien, pero en Symfony no:
Código:
SELECT v.id, v.matricula, vt.descripcion_vehiculo, vt.id
FROM vehiculos AS v
JOIN vehiculos_tipos AS vt ON v.id = vt.id
WHERE v.id_usuario = 70845
Devuelve
1 4467CGH Furgoneta 1
2 4468CGI Motocicleta 2

Pero En Symfony:
Código PHP:
$query $em->createQuery(
                            
'SELECT partial vt.{id,descripcionVehiculo}, 
                                    partial v.{id,matricula}
                                    FROM IPRestBundle:Vehiculos v 
                                    JOIN IPRestBundle:VehiculosTipos vt
                                    WITH v.idVehiculosTipo = vt.id
                                    WHERE v.idUsuario = :idUsuario'
)
                                ->
setParameter('idUsuario'$idUsuario);

            
$datosVehiculosMensajero $query->getResult(); 
Devuelve:
Código:
Array
(
    [0] => IP\RestBundle\Entity\Vehiculos Object
        (
            [id:IP\RestBundle\Entity\Vehiculos:private] => 1
            [idUsuario:IP\RestBundle\Entity\Vehiculos:private] => 
            [idVehiculosTipo:IP\RestBundle\Entity\Vehiculos:private] => 
            [matricula:IP\RestBundle\Entity\Vehiculos:private] => 4467CGH
            [seguro:IP\RestBundle\Entity\Vehiculos:private] => 
            [fechaProximaItv:IP\RestBundle\Entity\Vehiculos:private] => 
            [vehiculoPrincipal:IP\RestBundle\Entity\Vehiculos:private] => 
        )

    [1] => IP\RestBundle\Entity\VehiculosTipos Object
        (
            [id:IP\RestBundle\Entity\VehiculosTipos:private] => 1
            [descripcionVehiculo:IP\RestBundle\Entity\VehiculosTipos:private] => Furgoneta
        )

    [2] => IP\RestBundle\Entity\Vehiculos Object
        (
            [id:IP\RestBundle\Entity\Vehiculos:private] => 2
            [idUsuario:IP\RestBundle\Entity\Vehiculos:private] => 
            [idVehiculosTipo:IP\RestBundle\Entity\Vehiculos:private] => 
            [matricula:IP\RestBundle\Entity\Vehiculos:private] => 4468CGI
            [seguro:IP\RestBundle\Entity\Vehiculos:private] => 
            [fechaProximaItv:IP\RestBundle\Entity\Vehiculos:private] => 
            [vehiculoPrincipal:IP\RestBundle\Entity\Vehiculos:private] => 
        )

    [3] => IP\RestBundle\Entity\VehiculosTipos Object
        (
            [id:IP\RestBundle\Entity\VehiculosTipos:private] => 3
            [descripcionVehiculo:IP\RestBundle\Entity\VehiculosTipos:private] => Coche
        )

)

No lo entiendo
¿Por qué?

Muchas gracias
  #2 (permalink)  
Antiguo 09/05/2016, 15:28
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: Problema Consulta con JOIN

No requieres el with en esa consulta, ya que no estas agregando una restricción extra en el join, para la parte del id de usuario tienes que hacer join en la relación correspondiente y luego hacer el = con el parámetro que estas pasando
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #3 (permalink)  
Antiguo 10/05/2016, 00:51
 
Fecha de Ingreso: marzo-2007
Mensajes: 59
Antigüedad: 17 años, 1 mes
Puntos: 0
Pregunta Respuesta: Problema Consulta con JOIN

En primer lugar muchas gracias por la ayuda hhs.

Pero no acabo de entenderlo.
A ver si se explicarme.

He modificado el JOIN como decías pero he añadido un "v.id_vehiculos_tipo = vt.id" en el WHERE (si no, no sé cómo decirle qué campos hay que tener en cuenta para la relación).

En MySQL hago esta consulta:
Código:
SELECT v.id, v.matricula, vt.id, vt.descripcion_vehiculo
FROM vehiculos AS v
JOIN vehiculos_tipos AS vt 
WHERE v.id_vehiculos_tipo = vt.id 
AND v.id_usuario = 70845
Y el resultado son dos registros tal que así:
id | matricula | id1 | descripcion_vehiculo
1 | 4467CGH | 1 |Furgoneta
2 | 4468CGI | 3 | Coche

Y luego en Symfony:
Código PHP:
$query $em->createQuery('SELECT partial vt.{id,descripcionVehiculo}, 
                                    partial v.{id,matricula}
                                    FROM IPRestBundle:Vehiculos v 
                                    JOIN IPRestBundle:VehiculosTipos vt                                 
                                    WHERE v.idVehiculosTipo = vt.id AND v.idUsuario = :idUsuario'
)
                            ->
setParameter('idUsuario'$idUsuario);

$datosVehiculosUsuario $query->getResult();

print_r($datosVehiculosUsuario);
exit(); 
Pero el resultado me devuelve 4 resultados, los datos de la tabla/entidad "Vehiculos" por un lado y los de la tabla/entidad "VehiculosTipos" por otro, vamos, por separado, y para luego printarlos es un follón:
Código:
Array
(
    [0] => IP\RestBundle\Entity\Vehiculos Object
        (
            [id:IP\RestBundle\Entity\Vehiculos:private] => 1
            [idUsuario:IP\RestBundle\Entity\Vehiculos:private] => 
            [idVehiculosTipo:IP\RestBundle\Entity\Vehiculos:private] => 
            [matricula:IP\RestBundle\Entity\Vehiculos:private] => 4467CGH
            [seguro:IP\RestBundle\Entity\Vehiculos:private] => 
            [fechaProximaItv:IP\RestBundle\Entity\Vehiculos:private] => 
            [vehiculoPrincipal:IP\RestBundle\Entity\Vehiculos:private] => 
        )

    [1] => IP\RestBundle\Entity\VehiculosTipos Object
        (
            [id:IP\RestBundle\Entity\VehiculosTipos:private] => 1
            [descripcionVehiculo:IP\RestBundle\Entity\VehiculosTipos:private] => Furgoneta
        )

    [2] => IP\RestBundle\Entity\Vehiculos Object
        (
            [id:IP\RestBundle\Entity\Vehiculos:private] => 2
            [idUsuario:IP\RestBundle\Entity\Vehiculos:private] => 
            [idVehiculosTipo:IP\RestBundle\Entity\Vehiculos:private] => 
            [matricula:IP\RestBundle\Entity\Vehiculos:private] => 4468CGI
            [seguro:IP\RestBundle\Entity\Vehiculos:private] => 
            [fechaProximaItv:IP\RestBundle\Entity\Vehiculos:private] => 
            [vehiculoPrincipal:IP\RestBundle\Entity\Vehiculos:private] => 
        )

    [3] => IP\RestBundle\Entity\VehiculosTipos Object
        (
            [id:IP\RestBundle\Entity\VehiculosTipos:private] => 3
            [descripcionVehiculo:IP\RestBundle\Entity\VehiculosTipos:private] => Coche
        )

)
Claro, si yo ahora quiero printar la matrícula y el tipo de vehículo tengo que coger la matrícula del primer resultado y el tipo del segundo, y luego la matrícula del tercer resultado y el tipo del cuarto, y así etcétera (si un usuario tiene una flota de vehículos pues la cosa se complica).

Lo que no entiendo es cómo en una consulta normal de MySQL se obtienen dos resultados que juntan los campos de las dos tablas en un registro y con Symfony/Doctrine no está pasando.

Muy posiblemente sea porque hay algo que no estoy haciendo bien o que desconozco.

Muchas gracias por la ayuda.

Un cordial saludo.
  #4 (permalink)  
Antiguo 10/05/2016, 12:24
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: Problema Consulta con JOIN

Creo que necesitas leer esta parte del manual: http://docs.doctrine-project.org/pro...-mixed-results
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #5 (permalink)  
Antiguo 11/05/2016, 00:45
 
Fecha de Ingreso: marzo-2007
Mensajes: 59
Antigüedad: 17 años, 1 mes
Puntos: 0
Respuesta: Problema Consulta con JOIN

Ok hhs, me lo voy a mirar.

Eres un máquina!
Muchas gracias por tu ayuda.
  #6 (permalink)  
Antiguo 11/05/2016, 01:30
 
Fecha de Ingreso: marzo-2007
Mensajes: 59
Antigüedad: 17 años, 1 mes
Puntos: 0
Respuesta: Problema Consulta con JOIN

Perdona hhs, me lo he estado mirando pero sigo sin entenderlo, debo ser duro de mollera.

En la documentación de la página de Doctrine habla de resultados "pure" y "mixed", ok, pero en esos ejemplos todos los registros (resultados) tienen la misma estructura. Quiero decir, para la consulta con JOIN:
Código:
$dql = "SELECT u, 'some scalar string', count(u.groups) AS num FROM User u JOIN u.groups g GROUP BY u.id";
Devuelve los resultados:
Código:
array
    [0]
        [0] => Object
        [1] => "some scalar string"
        ['num'] => 42
        // ... more scalar values, either indexed numerically or with a name
    [1]
        [0] => Object
        [1] => "some scalar string"
        ['num'] => 42
        // ... more scalar values, either indexed numerically or with a name
En los que cada elemento del array tiene la misma estructura: [0][1]['num']

Y en el ejemplo de luego:
Código:
SELECT u, UPPER(u.name) nameUpper FROM MyProject\Model\User u
Da la respuesta:
Código:
array
    array
        [0] => User (Object)
        ['nameUpper'] => "ROMAN"
    array
        [0] => User (Object)
        ['nameUpper'] => "JONATHAN"
    ...
Que también tiene la misma estructura: [0]['nameUpper']

Y luego, claro, lo tiene "fácil" para obtener los datos con un foreach:
Código:
foreach ($results as $row) {
    echo "Name: " . $row[0]->getName();
    echo "Name UPPER: " . $row['nameUpper'];
}
Pero en mi caso:
Código:
Array
(
    [0] => IP\RestBundle\Entity\Vehiculos Object
        (
            [id:IP\RestBundle\Entity\Vehiculos:private] => 1
            [idUsuario:IP\RestBundle\Entity\Vehiculos:private] => 
            [idVehiculosTipo:IP\RestBundle\Entity\Vehiculos:private] => 
            [matricula:IP\RestBundle\Entity\Vehiculos:private] => 4467CGH
            [seguro:IP\RestBundle\Entity\Vehiculos:private] => 
            [fechaProximaItv:IP\RestBundle\Entity\Vehiculos:private] => 
            [vehiculoPrincipal:IP\RestBundle\Entity\Vehiculos:private] => 
        )

    [1] => IP\RestBundle\Entity\VehiculosTipos Object
        (
            [id:IP\RestBundle\Entity\VehiculosTipos:private] => 1
            [descripcionVehiculo:IP\RestBundle\Entity\VehiculosTipos:private] => Furgoneta
        )

    [2] => IP\RestBundle\Entity\Vehiculos Object
        (
            [id:IP\RestBundle\Entity\Vehiculos:private] => 2
            [idUsuario:IP\RestBundle\Entity\Vehiculos:private] => 
            [idVehiculosTipo:IP\RestBundle\Entity\Vehiculos:private] => 
            [matricula:IP\RestBundle\Entity\Vehiculos:private] => 4468CGI
            [seguro:IP\RestBundle\Entity\Vehiculos:private] => 
            [fechaProximaItv:IP\RestBundle\Entity\Vehiculos:private] => 
            [vehiculoPrincipal:IP\RestBundle\Entity\Vehiculos:private] => 
        )

    [3] => IP\RestBundle\Entity\VehiculosTipos Object
        (
            [id:IP\RestBundle\Entity\VehiculosTipos:private] => 3
            [descripcionVehiculo:IP\RestBundle\Entity\VehiculosTipos:private] => Coche
        )

)
El índice 0 y 2 tienen la misma estructura, y el 1 y 3 entre ellos también.
Pero entonces no hay manera de que pueda utilizar un foreach para recorrerlos...

Repito, no se si es culpa mía (muy posiblemente así sea), pero no entiendo por qué no encuentro la manera de que esto muestre los resultados como yo quiero.

Una vez más, muchas gracias.

Un saludo.
  #7 (permalink)  
Antiguo 16/05/2016, 07:24
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: Problema Consulta con JOIN

Si ya veo, no te agrupa los resultado como esperas, lo que se me ocurre de momento es que no tengas creada bien tus relaciones y por eso estés obteniendo resultados no esperados
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #8 (permalink)  
Antiguo 18/05/2016, 00:29
 
Fecha de Ingreso: marzo-2007
Mensajes: 59
Antigüedad: 17 años, 1 mes
Puntos: 0
Respuesta: Problema Consulta con JOIN

Ok hhs, miraré si la cosa viene por ahí.

Muchas gracias!

Etiquetas: join
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 23:36.