symfony2 / 学说:如何将 ResultSetMapping 与计数一起使用

Posted

技术标签:

【中文标题】symfony2 / 学说:如何将 ResultSetMapping 与计数一起使用【英文标题】:symfony2 / doctrine: how to use ResultSetMapping with count 【发布时间】:2015-05-14 14:34:57 【问题描述】:

我有一个存档表(id、title、author)和一个 download_history 表(id​​、id_archive、date)来跟踪每个存档的下载量。现在我想建立一个报告来查看每周下载次数最多的档案。在 SQL 中做起来很简单,但在教义上事情就更复杂了,这是我目前所做的:

public function getTopDownloadsLastXDays($limit=100, $days=7)

    $rsm = new ResultSetMapping();
    $rsm->addEntityResult('DownloadHistory', 'd');
    $rsm->addMetaResult('d', 'archive', 'archive');
    $rsm->addScalarResult('tot', 'tot');
    $rsm->addJoinedEntityResult('Archive', 'a', 'd', 'archive');
    $rsm->addFieldResult('a', 'author', 'author');
    $rsm->addFieldResult('a', 'title', 'title');

    $sql = "SELECT
              DISTINCT(dh.archive_id),
              COUNT(*) as tot,
              a.author,
              a.title
            FROM
              download_history dh
            INNER JOIN
              archive a
            ON
              dh.archive_id = a.id
            WHERE
              dh.date >= DATE(NOW()) - INTERVAL :days DAY
            GROUP BY
              dh.archive_id
            LIMIT :limit";

    $em = $this->getEntityManager();
    $query = $em->createNativeQuery($sql, $rsm);
    $query->setParameters(array(
        ':days'     =>  $days,
        ':limit'    =>  $limit,
    ));

    $results = $query->getResult();
    return $results;

实体存在并且工作正常。我在这里遵循了第三个示例: http://doctrine-orm.readthedocs.org/en/latest/reference/native-sql.html#examples。这是我的结果:

array(1)  
    [-1]=> array(1)  
        ["tot"]=> string(1) "1" 
     

有什么想法吗?谢谢

【问题讨论】:

你在 mysql 中测试过查询吗?它是否按预期工作? 是的,如果我在命令行上执行它,它会按预期工作。 【参考方案1】:

您将表别名为“dh”,但在构建 ResultSetMapping 时将别名指定为“d”。

【讨论】:

以上是关于symfony2 / 学说:如何将 ResultSetMapping 与计数一起使用的主要内容,如果未能解决你的问题,请参考以下文章

Symfony2,学说和数据域

如何使用 symfony2 学说查询生成器选择不同的查询?

symfony2 学说加入

学说查询的语法错误 (Symfony2)

未定义索引:joinColumns 学说 + symfony2

Symfony2 和空关系的学说