2011-06-08 18 views
7

Tengo un documento Persona a la que se hace referencia en el documento Usuario. Cuando recupero el Usuario, no tiene un objeto Person incrustado, sino un objeto proxy Person. ¿Hay alguna manera de "forzar" que el proxy se convierta en un documento "completo" (por lo que Person proxy => Person).Cómo forzar a DocGine MongoDB ODM Document Proxy a convertir al documento 'original'?

He intentado llamar a un método para recuperar datos adicionales (por lo __load se desencadena, pero el objeto permanece la versión 'proxy'.

espero que alguien pueda arrojar más luz sobre esto que documention del ODM hace.

+0

que parece que está tratando de establecer una relación en una base de datos no relacional – EhevuTov

+1

, ¿cree que lo que está señalando es que Doctrine perezosa carga la información referenciada? ¿Cómo está molestando esto su aplicación o el problema que está tratando de resolver? – Dayson

Respuesta

2

Usted puede lograr esto mediante Priming References

ejemplo, los documentos:.

/** @Document */ 
class User 
{ 
    /** @ReferenceOne(targetDocument="Person") */ 
    private $person; 
} 

/** @Document */ 
class Person 
{ 
    // ... 
} 

Utilizando el Generador de consultas:

/* @var $user User */ 
$user = $dm->createQueryBuilder('User') 
    ->field('person')->prime(true) 
    ->getQuery() 
    ->getSingleResult(); 
+0

Esta consulta arroja una excepción, porque después de usar prime no puede usar limit like en getSingleResult(). – Biruwon

2

No debería ser necesario para extraer el objeto original, ya que la clase de proxy debe ser 100% transparente a su código.

Si necesita serializar el documento, por ejemplo para enviarlo a través de una API, asegúrese de implementar correctamente el método serialize() en su documento.

Si todavía necesita para obtener el documento de referencia, sin que el proxy, puede que prime() o ir a buscar con una consulta independiente que especifica el hydrate(false):

$user = $dm->createQueryBuilder('Person') 
      ->field('_id')->equals($user->getPerson()->getId()) 
      ->hydrate(false) 

Ver: Doctrine ODM Doc: Disabling hydration para obtener más información.

Cuestiones relacionadas