es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Agrupar por en api-platform

¿Cómo añadir un simple group by en la queryString de api-platform?
Quiero eliminar los duplicados.

Ejemplo:

Datos:
Base de datos:

enter image description here

www.mySite.com/api/MyEntity.json?groupBy=Nombre

¿Cómo obtener este resultado?

enter image description here

Gracias por su ayuda.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para agregar un simple agrupado en queryString de api-platform, puedes usar la opción group_by en tu consulta de Doctrine ORM.

    Suponiendo que tienes una clase de entidad llamada MyEntity con un campo llamado Name que deseas agrupar, puedes crear un controlador personalizado para manejar la consulta del agrupado:

    1. Crea un controlador personalizado para el recurso MyEntity mediante la extensión de la clase AbstractController:
    namespace App\Controller;
    
    use App\Entity\MyEntity;
    use Doctrine\ORM\QueryBuilder;
    use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
    use Symfony\Component\HttpFoundation\Request;
    use Symfony\Component\HttpFoundation\Response;
    
    class MyEntityController extends AbstractController
    {
        public function groupByAction(Request $request): Response
        {
            // Obtén el EntityManager de Doctrine
            $em = $this->getDoctrine()->getManager();
    
            // Obtén el constructor de consulta para la clase de entidad MyEntity
            /** @var QueryBuilder $qb */
            $qb = $em->createQueryBuilder()
                ->select('e.Name, COUNT(e.id) as Count')
                ->from(MyEntity::class, 'e')
                ->groupBy('e.Name');
    
            // Obtén los resultados
            $results = $qb->getQuery()->getResult();
    
            // Devuelve los resultados como JSON
            return $this->json($results);
        }
    }
    

    Este controlador realiza la consulta en la base de datos con la sentencia GROUP BY:

    $db->query('
        SELECT Name, COUNT(id) 
        FROM MyEntity 
        GROUP BY Name
    ');
    
    1. Registra el controlador personalizado como servicio en tu archivo services.yaml:
    services:
        App\Controller\MyEntityController:
            tags: [ { name: 'api_platform.action', priority: 10 } ]
    
    1. Crea una operación personalizada en la configuración del recurso MyEntity para usar el controlador personalizado:
    # api/config/api_platform/resources.yaml
    resources:
        App\Entity\MyEntity:
            collectionOperations:
                get:
                    path: '/my_entities/group_by'
                    controller: App\Controller\MyEntityController::groupByAction
                    defaults:
                        _api_resource_class: 'App\Entity\MyEntity'
                        _api_collection_operation_name: 'group_by'
                        _api_receive: false
    

    Esto agrega una nueva operación de colección llamada group_by al recurso MyEntity que se asigna al método groupByAction en el controlador MyEntityController. La operación es accesible a través del endpoint /api/my_entities/group_by.

    Cuando accedas a este endpoint, deberías obtener el resultado esperado:

    [
        {
            "Name": "John",
            "Count": 2
        },
        {
            "Name": "Peter",
            "Count": 1
        },
        {
            "Name": "Sarah",
            "Count": 1
        }
    ]
    

    Esto eliminará los duplicados de tus resultados, agrupándolos por el campo Name.

Comments are closed.