2011-12-09 108 views
4

我是新來的學說ODM,我完全陷入了簡單的查詢:(Doctrine ODM/MongoDB:如何查詢嵌入文檔中的引用?

讓我先從文檔結構:

Array 
(
[_id] => 4ee1e4527f749c9411000012 
[voteList] => Array 
    (
     [_id] => 4ee1e4527f749c9411000013 
     [votes] => Array 
      (
       ... stripped ... 
      ) 
     [latest] => Array 
      (
       [_id] => 4ee1e4527f749c9411000014 
       [rating] => 1 
       [voter] => Array 
        (
         [$ref] => Voter 
         [$id] => 4ee1e4527f749c941100000f 
         [$db] => x_test 
        ) 

      ) 
    ) 
    ... stripped ... 
) 

這份文件被稱爲投票

我的問題是,如何由特定選民(存儲在voteList.latest找到投票 -documents .voter

我想它是這樣的:

$builder 
    ->field('voteList.latest.voter')->references($voter) 
    ->getQuery() 
    ->execute(); 

而且這種方式也:

$result = $builder 
    ->field('voteList.latest.voter.$id')->equals(new \MongoId($voter->getId())) 
    ->getQuery() 
    ->execute(); 

兩者都導致此異常:

Doctrine\ODM\MongoDB\MongoDBException: No mapping found for field 'voteList.latest.voter' in class 'App\BaseBundle\Document\Voting'. 

難道我不當構建查詢或者我的文檔類可能有問題?

感謝您的閱讀,任何意見讚賞。

編輯:附文件

/** 
    * @ODM\Document(repositoryClass="App\BaseBundle\Document\VotingRepository") 
    */ 
    class Voting 
    { 
     /** 
     * @ODM\Id 
     * @var int 
     */ 
     protected $id; 

     /** 
     * @ODM\EmbedOne(targetDocument="App\BaseBundle\Document\VoteList") 
     * @var VoteList 
     */ 
     protected $voteList; 

     public function __construct() 
     { 
      if ($this->voteList === null) { 
       $this->voteList = new VoteList(); 
      } 
     } 

     /** 
     * @return string 
     */ 
     public function getId() 
     { 
      return $this->id; 
     } 

     /** 
     * @return VoteList 
     */ 
     public function getVoteList() 
     { 
      return $this->voteList; 
     } 
    } 
    ; 

    /** 
    * @ODM\EmbeddedDocument 
    */ 
    class VoteList implements \Countable, \ArrayAccess, \IteratorAggregate 
    { 
     /** 
     * @ODM\Id 
     */ 
     protected $id; 

     /** 
     * @ODM\EmbedMany(targetDocument="App\BaseBundle\Document\Vote") 
     * @var Vote[] 
     */ 
     protected $votes = array(); 

     /** 
     * @ODM\EmbedOne(targetDocument="App\BaseBundle\Document\Vote") 
     * @var Vote 
     */ 
     protected $latest; 

     public function getId() 
     { 
      return $this->id; 
     } 

     /** 
     * @return Vote 
     */ 
     public function getLatest() 
     { 
      return $this->latest; 
     } 
    } 

    /** 
    * @ODM\EmbeddedDocument 
    */ 
    class Vote 
    { 
     /** 
     * @ODM\Id 
     */ 
     protected $id; 

     /** 
     * @ODM\ReferenceOne(targetDocument="App\BaseBundle\Document\Voter") 
     * @var Voter 
     */ 
     public $voter; 

     public function getId() 
     { 
      return $this->id; 
     } 

     public function getVoter() 
     { 
      return $this->voter; 
     } 

     public function setVoter(Voter $voter) 
     { 
      $this->voter = $voter; 
     } 
    } 
+0

你應該張貼您的兩個文件的代碼給我們一個更全面的瞭解。 –

+0

@elnur感謝您的評論。編輯:添加文件,剝離引用/嵌入的東西 – Eugene

回答

1

想通了它不工作因學說,ODM錯誤。

https://github.com/doctrine/mongodb-odm/pull/207

+0

看起來像它現在已經修復 – Gigala

+0

鏈接的問題似乎並沒有直接解決OP的問題,並且問題仍然存在於最新版本中。 – Gerry

+0

事實上,我已經放棄了除了一個項目之外的教義ODM的工作..與ORM相反,它的方式太多了,我也沒有看到它很快就會達到一個真正穩定的狀態。 – Eugene