2012-10-09 34 views
2

我想使用Doctrine結果映射,但我得到一個非常奇怪的結果。Doctrine2原生查詢:行移位

這是我在倉庫中「結果」代碼:

$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($結果[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]的結果,但具有被認爲是$result[0]結果的ID。 所以我認爲這種映射並不完全正確。

如果我執行在Navicat一切的SQL語句是完全正確的。

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

+1

如果要使用ORM(如doctrine),則應該嘗試實施查詢,避免使用普通SQL。你有沒有嘗試過使用Doctrine的DQL? –

+0

可能與http://www.doctrine-project.org/jira/browse/ddc-1362?嘗試訂購SQL查詢列,並以相同的順序作爲映射,看看是否可行? – luka8088

+0

@ luka8088謝謝你兄弟,那是解決方案.. – user1731323

回答