2011-12-09 4 views
4

Je suis nouveau à la doctrine ODM et je suis tout à fait coincé avec une requête simple :(Doctrine ODM/MongoDB: Comment rechercher des références dans des documents incorporés?

Permettez-moi de commencer par la structure du document.

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 ... 
) 

Ce document est appelé vote

Ma question est, comment trouver vote -Documents par un particulier électeur (qui est stocké dans voteList.latest .voter).

Je l'ai essayé comme ceci:

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

Et cette façon aussi:

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

Les deux mènent à cette exception:

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

que je crée la requête de manière incorrecte ou est-ce que quelque chose ne va pas avec mes classes de document?

Merci pour la lecture, tous les conseils appréciés.

EDIT: Documents attachés

/** 
    * @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

Vous devez envoyer le code de vos deux documents pour nous donner une image plus complète. –

+0

@elnur merci pour votre commentaire. Edit: Documents ajoutés, dépouillés pour référencer/incorporer des choses – Eugene

Répondre

1

cernées il ne fonctionne pas en raison d'un bug de doctrine odm.

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

+0

semble avoir été corrigé maintenant – Gigala

+0

Le problème lié ne semble pas résoudre directement le problème de l'OP, et le problème existe toujours dans la dernière version. – Gerry

+0

En fait, j'ai abandonné le travail avec la doctrine ODM sauf pour un projet .. contrairement à ORM son chemin trop bêta et je ne vois pas qu'il atteindra un état vraiment stable bientôt. – Eugene

Questions connexes