2012-03-06 42 views
3

我使用Symfony 2與原則。我使用自定義查找功能設置了自定義存儲庫。當它加入到一個子查詢中時,我確信從我讀過的內容中,我將需要使用ResultSetMappingBuilder從查詢中返回結果。不過,我不斷收到以下錯誤:不允許ResultSetMappingBuilder工作的原則

The column 'id' conflicts with another column in the mapper. 

我的代碼是:

$sql ="SELECT c.id as cid, c.country, c.rank, c.continent, q.* 
     FROM country c 
     INNER JOIN (
      SELECT d.* , MAX(d.rating) AS maxrating 
      FROM ducks d 
      GROUP BY d.country_id 
     )q ON (q.country_id = c.id)"; 

    $rsm = new \Doctrine\ORM\Query\ResultSetMappingBuilder($this->getEntityManager()); 
    $rsm->addRootEntityFromClassMetadata('Wfuk\DuckBundle\Entity\Country', 'c', array('id' => 'cid')); 
    $rsm->addJoinedEntityFromClassMetadata('Wfuk\DuckBundle\Entity\Ducks', 'ducks', 'c', 'country_id'); 

    $query = $this->getEntityManager()->createNativeQuery($sql, $rsm); 
    return $query->getResult(); 

的SQL查詢它自己的運行沒有任何問題,並返回我期望的結果。

UPDATE,我已經通過重新映射在addRootEntityFromClassMetadata id字段固定的ID問題,但我還有經修訂的joinedEntity剩餘問題:

$rsm->addJoinedEntityFromClassMetadata('Wfuk\DuckBundle\Entity\Ducks', 'ducks', 'c', 'country_id'); 

我得到以下錯誤:

Notice: Undefined index: country_id in E:\Documents\wfuk\Work\duck travels\wamp\vendor\doctrine\lib\Doctrine\ORM\Internal\Hydration\ObjectHydrator.php line 85 

我敢肯定,這是調用country_id的最後一個值,但我不是100%確定這是什麼。這裏的解釋:http://readthedocs.org/docs/doctrine-orm/en/latest/reference/native-sql.html不太清楚,我不完全理解類docblock的描述。

它給人的錯誤是:

The column 'id' conflicts with another column in the mapper. 

但我已經改名爲id字段的結果之一,所以結果只設置了所謂的「身份證」一列。

上錯誤的堆棧跟蹤顯示它在這裏被拋出:

at ResultSetMappingBuilder ->addAllClassFields ('Wfuk\DuckBundle\Entity\Ducks', 'q', array()) 
in E:\Documents\wfuk\Work\duck travels\wamp\vendor\doctrine\lib\Doctrine\ORM\Query\ResultSetMappingBuilder.php at line 71 

我懷疑這是明顯的東西,但沒有太多關於這個功能的文檔的方式,我能找到的任何地方...

解決:

我不能添加此爲5小時的答案,所以要避免任何人浪費時間回答這個問題的答案是:

對於任何人誰具有同樣的問題,這個問題是與這條線發送的第四個參數:

$rsm->addJoinedEntityFromClassMetadata('Wfuk\DuckBundle\Entity\Ducks', 'ducks', 'c', 'ducks'); 

本應認爲,我用的是存儲內的鴨子ArrayCollection的國家類中的字段它。

回答

-1

就關閉,因爲它是解決了一個問題:

對於任何人誰具有同樣的問題,這個問題是與這條線發送的第四個參數:

$rsm->addJoinedEntityFromClassMetadata('Wfuk\DuckBundle\Entity\Ducks', 'ducks', 'c', 'ducks'); 

本應舉行內場我正在使用Country Country來存儲其中的duckCollection。

+8

我有同樣的問題,但不太理解你的答案。 – 2014-05-06 15:43:29

+2

請改善答案,以便對他人有用。 – marcosdsanchez 2016-02-03 22:43:14

5

當創建ResultSetMappingBuilder指定COLUMN_RENAMING_INCREMENT命名模式學說來自動解決衝突

然後在你需要使用選擇產生實際的查詢:

$rsm = new ResultSetMappingBuilder(
     $entityManager, 
     ResultSetMappingBuilder::COLUMN_RENAMING_INCREMENT 
    ); 

    $rsm->addRootEntityFromClassMetadata("Product", "p"); 
    $rsm->addJoinedEntityFromClassMetadata("ProductImage", "pi", "p", "images"); 

    $query = $entityManager->createNativeQuery(" 
     SELECT " . $rsm->generateSelectClause() . " 
     FROM product p 
     JOIN product_image pi 
    ", $rsm);