2013-10-13 56 views
0

首先,我使用Doctrine2和Symfony2使用MySQL数据库。 我有以下实体,它与其他人有关系,如你所见。Doctrine2复杂统计查询

Pge\IncidenciasBundle\Entity\Incidencia: 
    type: entity 
    table: incidencia 
    repositoryClass: Pge\IncidenciasBundle\Entity\IncidenciaRepository 
    id: 
     id: 
     type: integer 
     generator: 
      strategy: IDENTITY 
    fields: 
     fechaInicio: 
      type: date 
      nullable: false 
      column: fecha_inicio 
     fechaFinal: 
      type: date 
      nullable: true 
      column: fecha_final 
     horaInicio: 
      type: time 
      nullable: true 
      column: hora_inicio 
     horaInicioIndisp: 
      type: time 
      nullable: true 
      column: hora_inicio_indisp 
     horaFinal: 
      type: time 
      nullable: true 
      column: hora_final 
     horaFinalIndisp: 
      type: time 
      nullable: true 
      column: hora_final_indisp 
     causa: 
      type: text 
      nullable: true 
     resumen: 
      type: string 
      length: 250 
      fixed: false 
      nullable: true 
     descripcion: 
      type: text 
      nullable: true 
     solucion: 
      type: text 
      nullable: true 
     remedy: 
      type: string 
      length: 250 
      fixed: false 
      nullable: true 
     accionesRealizadas: 
      type: text 
      nullable: true 
      column: acciones_realizadas   
    manyToOne: 
     prioridad: 
      targetEntity: Prioridad 
     estado: 
      targetEntity: Estado 
     indisponibilidad: 
      targetEntity: Indisponibilidad 
     cliente: 
      targetEntity: Cliente 
      inversedBy: incidencia 
     servicio: 
      targetEntity: Servicio 
    lifecycleCallbacks: { } 

我试图做一个查询,我检索数据给出的日期,这个输出(图像是在HTML中的手工表)

enter image description here

所以,对于每一个Cliente我需要每行中打印的表格,其Servicio,并为每个Prioridad的发现Incidencia这样一个计数器,如果有3 IncidenciaPrioridad = P0,1 Prioridad = P1和2 Prioridad = P3Servicio = KOSMOSCliente = Someone,该表将输出这个

Someone 
       SERVICIO P0 P1 P2 P3 
       KOSMOS  3 1 0 2 

它只是作为简单的,但我的问题是,我无法找到产生这种查询的方式......我试图创建多个磁盘阵列与一些foreachs和一些querys的东西,创建一个Cliente分离的数组,并为每个日期,服务等数组,但我找不到方法来计数Prioridad,这显然不是一个好的做法,因为有约8个foreach,foreach内查询等...所以不好,但我真的迷失了...

我认为必须有一个简单的方法来做到这一点,但不是我的知识...

回答

1

我显然不能测试这个查询,所以你可能需要玩它,但基本上我们使用COUNT和多个groupBy子句。另外,我只是在SO答复框中输入了这个,所以请原谅。

$queryBuilder->select('incidencia, COUNT(incidencia.id) AS incidencia_count, prioridad, cliente, servicio') 
    ->from('Pge\IncidenciasBundle\Entity\Incidencia', 'incidencia') 
    ->leftJoin('incidencia.prioridad', 'prioridad', 'WITH', 'prioridad = incidencia.prioridad') 
    ->leftJoin('incidencia.cliente', 'cliente', 'WITH', 'cliente = incidencia.cliente') 
    ->leftJoin('incidencia.servicio', 'servicio', 'WITH', 'servicio = incidencia.servicio') 
    ->groupBy('prioridad.id, cliente.id, servicio.id'); 

(你可以转换到DQL如果你想,只是觉得它更容易使用QB较长/更复杂的查询)

我不知道你用的是什么领域的日期,但只是将其添加为查询的where子句。

您最终得到的结果是每个优先排序的incidencia数量的行数,但也适用于每个客户和服务商。

e.g(简体)

prioridad | cliente | servicio | incidencia_count 
    p0 | someone | kosmos |  3 
    p1 | someone | kosmos |  1 
    p2 | someone | kosmos |  0 
    p3 | someone | kosmos |  2 

就遍历这些数据来建立你的看法。