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

Consulta dql con llave foranea

Estas en el tema de Consulta dql con llave foranea en el foro de Symfony en Foros del Web. Estoy tratando de traer datos desde otra tabla con una llave foranea pero me sale un error. tengo las entidades: PROPIETARIO id nombres apellidos identificacion ...
  #1 (permalink)  
Antiguo 01/04/2018, 07:30
 
Fecha de Ingreso: enero-2010
Ubicación: Colombia
Mensajes: 238
Antigüedad: 9 años, 6 meses
Puntos: 2
Consulta dql con llave foranea

Estoy tratando de traer datos desde otra tabla con una llave foranea pero me sale un error. tengo las entidades:

PROPIETARIO
id
nombres
apellidos
identificacion


MASCOTA
id
nombres
edad

Consulta dql:

Código PHP:
    public function dql3Action(Request $request)
    {
        
$em $this->getDoctrine()->getManager();

        
$dql "SELECT m.id, m.nombres, m.propietario, p.id, p.nombres, p.apellidos

                FROM PPPCanBundle:Mascota m 

                JOIN m.propietario p WHERE p.id=:id 

        "
;

        
$usuarios $em->createQuery($dql);
        
$usuarios->setParameter('id''16');

error:
[Semantical Error] line 0, col 26 near 'propietario,': Error: Invalid PathExpression. Must be a StateFieldPathExpression.

Lo que quiero hacer es desde la clave foranea del propietario de la entidad MASCOTA traer los datos del propietario. alguie que me colabore ya que soy nuevo en consultas dql con symfony
  #2 (permalink)  
Antiguo 02/04/2018, 06:25
 
Fecha de Ingreso: octubre-2007
Mensajes: 272
Antigüedad: 11 años, 10 meses
Puntos: 5
Respuesta: Consulta dql con llave foranea

Suponiendo q mascota y propietario están realmente relacionados, lo mas seguro sea una relacion M-1. Asi q cuando haces Select ...., m.propietario te ha de faltar la peopiedad exacta q quieres obtener de la emtidad peopietario. Y si hay un join pues no es necesario.
Puedes hacer
Código:
Select m, p From ....
  #3 (permalink)  
Antiguo 02/04/2018, 17:47
Avatar de mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.805
Antigüedad: 9 años, 11 meses
Puntos: 214
Respuesta: Consulta dql con llave foranea

Saludo

Intentalo así

Código PHP:
Ver original
  1. $query = $this->getEntityManager()
  2.         ->createQuery(
  3.             'SELECT m.nombres, p.nombres, p.apellidos FROM Bundle:Mascota m
  4.            JOIN m.propietario p
  5.            WHERE m.id = :id'
  6.         )->setParameter('id', $id);
__________________
"Si consigues ser algo más que un hombre, si te entregas a un ideal, si nadie puede detenerte, te conviertes en algo muy diferente."
Visita piggypon.com

Última edición por mortiprogramador; 02/04/2018 a las 17:57
  #4 (permalink)  
Antiguo 03/04/2018, 20:45
 
Fecha de Ingreso: enero-2010
Ubicación: Colombia
Mensajes: 238
Antigüedad: 9 años, 6 meses
Puntos: 2
Respuesta: Consulta dql con llave foranea

Gracias por sus comentarios ya solucione asi:
Código PHP:
Ver original
  1. $dql = "SELECT m.id, m.nombres, p.apellidos, p.nombres, r.dtalleraza, m.edad,
  2.                       m.genero
  3.  
  4.                FROM PPPCanBundle:Mascota m  
  5.  
  6.                JOIN  m.propietario p
  7.                JOIN  m.raza r ";
  8.  
  9.         $mascotas = $em->createQuery($dql);

Pero tengo otra duda, Como hago para imprimir todos los datos, tanto los de la entidad PROPIETARIO Y MASCOTA en una sola funcion (pagina) con base al id de un registro. Lo estoy intentando hacer de la siguiente manera pero solo me deja imprimir los datos de la entidad MASCOTA

MascotaController.php

Código PHP:
Ver original
  1. public function viewAction($id)
  2.     {
  3.         $mascota = $this->getDoctrine()
  4.             ->getRepository('PPPCanBundle:Mascota')
  5.             ->find($id);
  6.        
  7.         $propietarioName = $mascota->getPropietario()->getNombres();
  8.  
  9.         if(!$mascota)
  10.         {
  11.             throw $this->createNotFoundException('Mascota no encontrada.');
  12.         }
  13.  
  14.         return $this->render('PPPCanBundle:Mascota:view.html.twig', array('mascota' => $mascota));
  15.     }

view.html.twig

Código HTML:
Ver original
  1.  
  2. {{ mascota.nombres }} (Nombre de la mascota)
  3. {{ mascota.edad }} (Edad de la mascota)
  4.  
  5. {{ mascota.nombres }} (Nombres del propietario)
  6. {{ mascota.apellidos }} (Apellidos del propietario)
  7. {{ mascota.identificacion }} (Identificacion del propietario)
  8.  
  9. </body>
  10. </html


Alguien que por favor me ayude.
  #5 (permalink)  
Antiguo 03/04/2018, 20:57
Avatar de mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.805
Antigüedad: 9 años, 11 meses
Puntos: 214
Respuesta: Consulta dql con llave foranea

Saludo

Bueno, si ya solucionaste el query, imagino que la variable $propietarioName
tiene el valor correcto, en cuyo caso lo único que falta es pasarlo a la vista.

Para eso, agregalo al array del render donde ya esta mascota, y luego en la vista llamas a esa posición del array
__________________
"Si consigues ser algo más que un hombre, si te entregas a un ideal, si nadie puede detenerte, te conviertes en algo muy diferente."
Visita piggypon.com
  #6 (permalink)  
Antiguo 03/04/2018, 21:46
 
Fecha de Ingreso: enero-2010
Ubicación: Colombia
Mensajes: 238
Antigüedad: 9 años, 6 meses
Puntos: 2
Respuesta: Consulta dql con llave foranea

Listo ya lo hice pero me sale este mensaje de error:

Impossible to access an attribute ("nombres") on a string variable ("Nelson Andres").

Código PHP:
Ver original
  1. public function viewAction($id)
  2.     {
  3.         $mascota = $this->getDoctrine()
  4.             ->getRepository('PPPCanBundle:Mascota')
  5.             ->find($id);
  6.        
  7.         $propietarioNombres = $mascota->getPropietario()->getNombres();
  8.  
  9.         if(!$mascota)
  10.         {
  11.             throw $this->createNotFoundException('Mascota no encontrada.');
  12.         }
  13.  
  14.         return $this->render('PPPCanBundle:Mascota:view.html.twig', array('mascota' => $mascota,
  15.             'propietarioNombres' => $propietarioNombres));
  16.     }

Código HTML:
Ver original
  1. {{ propietarioNombres.nombres }}
Aque se debe este error?

Última edición por nelson12345; 03/04/2018 a las 21:47 Razón: Adicionar
  #7 (permalink)  
Antiguo 04/04/2018, 01:17
Avatar de mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.805
Antigüedad: 9 años, 11 meses
Puntos: 214
Respuesta: Consulta dql con llave foranea

Eso es porque no se está enviando un objeto,
sino se esta enviando el valor del atributo de una vez.

En ese caso, hay dos soluciones:

1. En la vista solo deja propietarioNombres
Esta es la más sencilla

2. Si necesitas aparte de los nombres, otros datos del propietario,
entonces mejor has esto:
- En el controlador deja hasta getPropietario() para obtener todos los atributos,
y lo mejor sería también cambiar el nombre de la variable a $propietario en vez de $propietarioNombres, esto a su vez afecta el array que se le envía a la vista, en cuyo caso la posición a enviar también que se llame propietario
- En la vista ahora sería cuestión de usarla con el nuevo nombre (propietario.nombres)
__________________
"Si consigues ser algo más que un hombre, si te entregas a un ideal, si nadie puede detenerte, te conviertes en algo muy diferente."
Visita piggypon.com

Etiquetas: llave
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 08:09.