PHP - Hacer un join en symfony 5

 
Vista:
sin imagen de perfil

Hacer un join en symfony 5

Publicado por qwerty (10 intervenciones) el 28/09/2021 13:31:45
Buenos dias,

Estoy empezando a hacer consultas utilizando el framework de Symfony 5 y tengo el siguiente problema:

Tengo una tabla que se llama "Historico_Garantias" en la cual tengo bastantes campos los cuales algunos estan relacionados con otras tablas.

Uno de esos campos que tiene historico garantias es "usuario" el cual se relaciona con la tabla "Usuarios" que contiene la informacion de estos.
En esta tabla de usuarios esta el campo "delegacion" que simplemente es la localizacion este usuario.

Bien, lo que intento hacer es crear un filtro para que me muestre en pantalla X registros del historico de garantias con X condiciones que tiene que cumplir, una de ellas es que los usuarios solo pueden ver las garantias que estan asociadas a su delegacion. Es decir, si el usuario pertenece a la delegacion de "valencia" solo podra ver los registros de las garantias que estan asociadas a "Valencia"

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?php
 
namespace App\Repository;
 
use App\Entity\HistoricoGarantias;
use App\Entity\Usuarios;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\ORM\Query\Expr\From;
use Doctrine\Persistence\ManagerRegistry;
 
/**
 * @method HistoricoGarantias|null find($id, $lockMode = null, $lockVersion = null)
 * @method HistoricoGarantias|null findOneBy(array $criteria, array $orderBy = null)
 * @method HistoricoGarantias[]    findAll()
 * @method HistoricoGarantias[]    findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
 */
class HistoricoGarantiasRepository extends ServiceEntityRepository
{
    public function __construct(ManagerRegistry $registry)
    {
        parent::__construct($registry, HistoricoGarantias::class);
    }
 
 
    /**
     * @return HistoricoGarantias[]
     */
    public function sinAbonos()
    {
        return $this->createQueryBuilder('g'))
            ->andWhere('g.fechaAbonoCliente IS NULL AND g.abonoClienteRetenido=0 AND g.resolucionIncidenciaCliente!=3 AND g.delegacion=g.usuario.delegacion')
            ->orderBy('g.fechaEntradaMaterial', 'DESC')
            ->getQuery()
            ->getResult()
        ;
    }

Como veis he añadido ya algunas de las condiciones que necesito pero no he tenido aun la necesidad de hacer JOINS entre tablas, y no encuentro nada que me aclare como hacerlo.

Como podria poner en esa consulta que por ejemplo:

delegacion=usuario.delegacion (en otra parte del codigo tengo esto app.user.delegacion, que me muestra la delegacion del usuario que se loguea, pero no se aplicarlo a lo que quiero)

Gracias y saludos!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Mauro
Val: 2.761
Oro
Ha aumentado 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

Hacer un join en symfony 5

Publicado por Mauro (1034 intervenciones) el 02/10/2021 17:15:31
Hola qwerty:

El QueryBuilder de Doctrine ofrece un método "join" que puedes usar. Puedes consultar aquí para ver detalles, pero en principio puedes usar algo como:

1
2
3
4
5
6
7
8
9
10
public function sinAbonos()
    {
        return $this->createQueryBuilder('g'))
            ->innerJoin('g.Usuario', 'u')
            ->andWhere('g.fechaAbonoCliente IS NULL AND g.abonoClienteRetenido=0 AND g.resolucionIncidenciaCliente!=3 AND g.delegacion=g.usuario.delegacion')
            ->orderBy('g.fechaEntradaMaterial', 'DESC')
            ->getQuery()
            ->getResult()
        ;
    }

Espero esto te ayude :)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Hacer un join en symfony 5

Publicado por qwerty (10 intervenciones) el 04/10/2021 10:32:11
Buenos dias Mauro,

Gracias por tu respuesta, he intentado hacerlo con tu ejemplo pero me sale el siguiente error, que es el que me salia con otras pruebas que hice yo:

"[Semantical Error] line 0, col 68 near 'u WHERE g.fechaAbonoCliente': Error: Class App\Entity\HistoricoGarantias has no association named Usuarios"

Es como si no llegara a acceder a la tabla de usuarios

1
2
3
4
5
6
7
8
9
10
public function sinAbonos()
    {
        return $this->createQueryBuilder('g'))
            ->innerJoin('g.Usuario', 'u')
            ->andWhere('g.fechaAbonoCliente IS NULL AND g.abonoClienteRetenido=0 AND g.resolucionIncidenciaCliente!=3 AND g.delegacion=u..delegacion')
            ->orderBy('g.fechaEntradaMaterial', 'DESC')
            ->getQuery()
            ->getResult()
        ;
    }

He probado de la siguiente manera y no me salta ese error, pero no hace bien el filtrado, ya que no me saca ninguna linea.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Hacer un join en symfony 5

Publicado por qwerty (10 intervenciones) el 04/10/2021 15:36:50
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php
 
namespace App\Repository;
 
use App\Entity\HistoricoGarantias;
use App\Entity\Usuarios;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
 
/**
 * @method HistoricoGarantias|null find($id, $lockMode = null, $lockVersion = null)
 * @method HistoricoGarantias|null findOneBy(array $criteria, array $orderBy = null)
 * @method HistoricoGarantias[]    findAll()
 * @method HistoricoGarantias[]    findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
 */
 
 
class HistoricoGarantiasRepository extends ServiceEntityRepository
{
    public function __construct(ManagerRegistry $registry)
    {
        parent::__construct($registry, HistoricoGarantias::class);
    }
 
public function sinAbonos()
    {
        return $this->createQueryBuilder('g')
            ->innerJoin('g.Usuario', 'u')
            ->andWhere('g.fechaAbonoCliente IS NULL AND g.abonoClienteRetenido=0 AND g.resolucionIncidenciaCliente!=3 AND g.delegacion=u.delegacion')
            ->orderBy('g.fechaEntradaMaterial', 'DESC')
            ->getQuery()
            ->getResult()
        ;
    }}

Lo he copiado mal perdon.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Mauro
Val: 2.761
Oro
Ha aumentado 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

Hacer un join en symfony 5

Publicado por Mauro (1034 intervenciones) el 05/10/2021 04:01:54
¿Sigue sin funcionar? Fíjate que el error anterior dice que no hay una asociación llamada Usuarios.

¿Puedes mostrar el código de tu entidad HistoricoGarantias?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Hacer un join en symfony 5

Publicado por qwerty (10 intervenciones) el 05/10/2021 09:31:48
Buenas Mauro,

Te adjunto el fichero ya que es bastante largo.

Creo que el error esta ahí, pero a la hora de rellenar un formulario para crear un registro de una garantía no me da problemas al seleccionar el usuario por ejemplo.

Pero ahora que lo dices tengo un error al hacer el getUsuario(), voy a investigar a ver si puedo sacar el error.

Gracias de antemano!

PD: He añadido también la entity de Usuarios por si hiciera falta.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Mauro
Val: 2.761
Oro
Ha aumentado 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

Hacer un join en symfony 5

Publicado por Mauro (1034 intervenciones) el 05/10/2021 16:22:03
¿Cuál es el error que ves en el getUsuario?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Hacer un join en symfony 5

Publicado por qwerty (10 intervenciones) el 05/10/2021 16:27:50
Capturaerrorusuarios

Me sale ese error Mauro. Me sale con otros campos por lo que ves. El editor que estoy usando es el visual studio.

Si lo abro con el PHPStorm, me sale "undefined class Usuarios".

He estado probando bastantes formas de escribirlo y no consigo corregirlo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Mauro
Val: 2.761
Oro
Ha aumentado 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

Hacer un join en symfony 5

Publicado por Mauro (1034 intervenciones) el 07/10/2021 13:31:30
Ya. Me llama la atención que la clase se llame "Usuarios" y no "Usuario"... por lo general en Doctrine se utiliza el singular para nombrar las entidades. Es más, yo te recomendaría que lo escribas todo en inglés para mayor claridad.

Será que te falta algún "use" al comienzo?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar