2017-07-27 3 views
0



Je suis nouveau sur symfony et je crée un projet en utilisant mongodb comme base de données. J'utilise le document incorporé afin de réaliser la base de données à plusieurs niveaux. Voici deux fichiers de documents que je utilise:
Documents:La méthode de recherche sur le document incorporé retourne null dans symfony mongo

namespace AppBundle\Document; 

/** 
* @MongoDB\Document() 
*/ 
class State 
{ 
    /** 
    * @MongoDB\Id() 
    */ 
    protected $id; 

    /** 
    * @MongoDB\Field(type="string") 
    */ 
    protected $name; 

    /** 
    * @MongoDB\Field(type="string") 
    */ 
    protected $code; 

    /** 
    * @MongoDB\EmbedMany(targetDocument="City") 
    */ 
    protected $cities = array(); 

    /** 
    * State constructor. 
    */ 
    public function __construct() 
    { 
     $this->cities = new ArrayCollection(); 
    } 

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

    /** 
    * @param mixed $id 
    */ 
    public function setId($id) 
    { 
     $this->id = $id; 
    } 

    /** 
    * @return mixed 
    */ 
    public function getName() 
    { 
     return $this->name; 
    } 

    /** 
    * @param mixed $name 
    */ 
    public function setName($name) 
    { 
     $this->name = $name; 
    } 

    /** 
    * @return mixed 
    */ 
    public function getCode() 
    { 
     return $this->code; 
    } 

    /** 
    * @param mixed $code 
    */ 
    public function setCode($code) 
    { 
     $this->code = $code; 
    } 

    /** 
    * @return City[] 
    */ 
    public function getCities() 
    { 
     return $this->cities; 
    } 

    /** 
    * @param City $city 
    */ 
    public function addCities(City $city) 
    { 
     $this->cities[] = $city; 
    } 
} 

/** 
* @MongoDB\EmbeddedDocument() 
*/ 
class City 
{ 
    /** 
    * @MongoDB\Id 
    */ 
    protected $id; 

    /** 
    * @MongoDB\Field(type="string") 
    */ 
    protected $name; 

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

    /** 
    * @param mixed $id 
    */ 
    public function setId($id) 
    { 
     $this->id = $id; 
    } 

    /** 
    * @return mixed 
    */ 
    public function getName() 
    { 
     return $this->name; 
    } 

    /** 
    * @param mixed $name 
    */ 
    public function setName($name) 
    { 
     $this->name = $name; 
    } 

} 

Je suis bien en mesure d'ajouter des données à base de données et l'aperçu de celui-ci apparaît ci-dessous:

{ 
    "_id" : ObjectId("59783f79d6faef0dc13cc8ce"), 
    "name" : "New South Wales", 
    "code" : "NSW", 
    "cities" : [ 
     { 
      "_id" : ObjectId("59783f79d6faef0dc13cc8cf"), 
      "name" : "Sydney" 
     } 
    ] 
} 

Et maintenant que je reçois données en utilisant la méthode "find()" avec son id:

$city = $this->get('doctrine_mongodb') 
->getManager() 
->getRepository('AppBundle:City') 
->find("59783f79d6faef0dc13cc8cf"); 

Alors, Le problème est ici:

Je reçois null en ville $. Comment puis-je obtenir les détails de la ville comme nom?

Répondre

1

Vous avez mappé City en tant que document incorporé, il ne peut donc pas exister sans son document parent. La seule façon de l'obtenir est d'aller chercher le State puis de passer par $state->getCities(). Si vous avez besoin d'une requête pour les villes, vous avez besoin de références, donc City deviendrait un document de première classe avec sa propre collection que Mongo peut scanner.

+0

Donc, est-il possible de trouver les détails "Etat" parent à partir de l'id de ville disponible en utilisant le gestionnaire de document? – AnkitJ

+0

Oui, vous devez utiliser Query Builder et lire à propos de ['$ elemMatch'] (https://docs.mongodb.com/v3.0/reference/operator/query/elemMatch/) – malarzm