簡體   English   中英

Doctrine2本機查詢:行被移位

[英]Doctrine2 Native Query: Rows are shifted

我想使用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
  }
}

看,private $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語句,那么一切都非常正確。

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

解決方法如下:

使用addJoinedEntityResult您必須按照與選擇sql語句中的列相同的順序進行映射。

有關更多信息,請訪問: http : //www.doctrine-project.org/jira/browse/ddc-1362

我不知道學說團隊為什么要關閉票。

感謝@ luka8088提供此解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM