Doctrine2 Native Query:行被移位

时间:2012-10-09 10:09:00

标签: php symfony doctrine sqlresultsetmapping

我想使用Doctrine结果映射,但是我得到了一个非常奇怪的结果。

这是我的存储库“结果”中的代码:

    $sql = 'SELECT * FROM (
                SELECT
                k.id AS keyword_id,
                k.name,
                r.position,
                r.date,
                r.id
                FROM
                Result r
                INNER JOIN Keyword k ON r.keyword_id = k.id
                WHERE r.domain_id = 2005
                ORDER BY
                date DESC
            ) AS foo
            GROUP BY
            CONCAT(name, DATE_FORMAT(date, \'%Y%m\') )
            ORDER BY
            CONCAT(name, date) ASC;';

    $rsm = new ResultSetMapping;
    $rsm->addEntityResult('XXX\SesBundle\Entity\Result', 'r');
    $rsm->addFieldResult('r', 'id', 'id');
    $rsm->addFieldResult('r', 'position', 'position');
    $rsm->addFieldResult('r', 'date', 'date');
    $rsm->addJoinedEntityResult('XXX\SesBundle\Entity\Keyword', 'k', 'r', 'keyword');
    $rsm->addFieldResult('k', 'keyword_id', 'id');
    $rsm->addFieldResult('k', 'name', 'name');

    $em = $this->getEntityManager();

    $results = $em->createNativeQuery($sql, $rsm)
                ->getResult();

    return $results;

必须有20个结果,如果我count($results),结果为20。

但如果我var_dump($ result [19])我得到这个转储:

  [19] =>
  class Example\SesBundle\Entity\Result#1565 (7) {
    private $id =>
    int(498)
    private $url =>
    NULL
    private $position =>
    int(30)
    private $date =>
    class DateTime#1594 (3) {
      public $date =>
      string(19) "2012-10-02 12:04:17"
      public $timezone_type =>
      int(3)
      public $timezone =>
      string(13) "Europe/Berlin"
    }
    private $keyword =>
    NULL
    private $domain =>
    NULL
    private $engine =>
    NULL
  }
}

看,私人$keywordNULL。适当的转储应如下所示:

  [16] =>
  class Example\SesBundle\Entity\Result#1623 (7) {
    private $id =>
    int(19)
    private $url =>
    NULL
    private $position =>
    int(2)
    private $date =>
    class DateTime#1619 (3) {
      public $date =>
      string(19) "2012-09-28 17:33:26"
      public $timezone_type =>
      int(3)
      public $timezone =>
      string(13) "Europe/Berlin"
    }
    private $keyword =>
    class Example\SesBundle\Entity\Keyword#1647 (3) {
      private $id =>
      int(2376)
      private $name =>
      string(19) "Example"
      private $domain =>
      class Doctrine\ORM\PersistentCollection#1624 (9) {
        ...
      }
    }
    private $domain =>
    NULL
    private $engine =>
    NULL
  }

还有另一种非常奇怪的行为。结果“转移”了。 应该是$result[0]的结果不会出现在var_dump()中。 如果代码被执行$result[0]的结果应该是$result[1],但是结果的id应该是$result[0]。 所以我认为映射不太合适。

如果我在Navicat中执行SQL语句,一切都很正确。

抱歉我的英语不好,我希望你明白我的意思:)。

1 个答案:

答案 0 :(得分:0)

以下是解决方案:

使用addJoinedEntityResult时,您必须按照与sql语句中的列相同的顺序进行映射。

有关详细信息,请查看: http://www.doctrine-project.org/jira/browse/ddc-1362

我不知道为什么学说团队关闭了这张票。

感谢@ luka8088提供此解决方案。