Doctrine2复杂查询统计信息

时间:2013-10-13 19:47:51

标签: php mysql symfony datatable doctrine-orm

首先,我正在使用Doctrine2和Symfony2使用MySQL数据库。 我有以下实体,它与其他一些实体有关系,你可以看到。

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都有一个计数器,所以,如果IncidenciaPrioridad = P0有3个Prioridad = P1 Prioridad = P3,1 Servicio = KOSMOS和2 Cliente = Someone,则表格将输出此

Someone
                SERVICIO    P0  P1  P2  P3
                KOSMOS      3   1   0   2

就像这一样容易,但我的问题是我找不到生成此查询的方法...我尝试使用一些foreach和一些查询的东西创建多个数组,创建一个{{ 1}}分隔数组,对于给定的每个日期,服务数组等,但我找不到计算Cliente的方法,这显然不是一个好习惯,因为大约有8个foreach,querys在foreach等地方...所以不好,但我真的迷路了...

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

1 个答案:

答案 0 :(得分: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数量,以及每个客户和服务的行数。

例如(简化)

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

只需循环遍历此数据即可构建您的视图。