2

我想使用 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 语句,一切都是正确的。

对不起我的英语不好,我希望你明白我的意思:)

4

1 回答 1

0

这是解决方案:

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

欲了解更多信息,请查看: http: //www.doctrine-project.org/jira/browse/ddc-1362

我不知道为什么教义团队关闭了票。

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

于 2012-10-10T15:12:21.533 回答