2012-09-19 39 views
8

Tengo un pequeño problema con el método Doctrine modelo hydrate(). I utilizar este método para hidratar un objeto de modelo conrete de una matriz dada, así:Doctrine 1.2 método de hidratación - array para modelar el objeto

$model = new Doctrine\Model\Model; 
$model->hydrate($model_array); 

todo funciona perfecto cuando la hidratación de objetos simples withou sub-modelos anidados. Ahora el problema es que necesito hidratar (utilizando este método) un objeto que tiene objetos anidados (y algunos de ellos también tienen objetos anidados).

Si estuviera usando HYDRATE_RECORD estaría bien, pero todos los registros de la consulta se devolverán como objetos lo que significa más consumo de memoria. Por lo tanto, estoy usando HYDRATE_ARRAY y bajo demanda hidrato esa matriz de concreto a un objeto.

Supongamos que tengo un modelo A que tiene modelos anidados AB, AC (de uno a muchos), AD y AC tiene otro modelo anidado ACE. Después print_r de la matriz A pudimos ver esta estructura:

A Array (
    ... 
    ab Array (...) 
    ac Array (
     AC Array (
      ... 
      ace Array (...) 
     ) 
     AC Array (
      ... 
      ace Array (...) 
     ) 
     ... 
    ) 
    ad Array (...) 
) 

Normalmente después de usar hidrato yo asumiría que este sería mi objetivo:

A Object { 
    ... 
    ab Object { ... } 
    ac Array (
     AC Object { 
      ... 
      ace Object { ... } 
     } 
     AC Object { 
      ... 
      ace Object { ... } 
     } 
     ... 
    ) 
    ad Object { ... } 
} 

Pero en lugar de esto me sale esta estructura:

A Object { 
    ... 
    ab Array (...) 
    ac Array (
     AC Array (
      ... 
      ace Array (...) 
     ) 
     AC Array (
      ... 
      ace Array (...) 
     ) 
     ... 
    ) 
    ad Array (...) 
} 

Así que solo el modelo principal se convirtió a un objeto. ¿Conoces una forma de conseguir que todas las matrices de modelos anidados se conviertan en objetos como el supuesto resultado?

Y no, no puedo usar HYDRATE_RECORD al consultar la base de datos.

+0

@ j0k ¿por qué no debería agradecerle la respuesta? – shadyyx

+3

Política del sitio, no hay cierres de sesión, gracias, ese tipo de cosas en la pregunta real, ya que no es parte de la pregunta. Bien en comentarios. – Orbling

+2

Ver [este hilo] (http://meta.stackexchange.com/q/2950/182741). – j0k

Respuesta

1

Revisando la documentación si se encontró con this.

¿Has probado fromArray en lugar de hydrate?

+0

No he intentado con 'fromArray()'. Sin embargo, hace algunos meses que no estoy trabajando en ese proyecto, tuve que usar la carga lenta que estaba tratando de evitar ... Si estuviera haciendo algunas modificaciones en ese proyecto nuevamente, lo probaría. ¡Aceptará tu respuesta por ahora ya que parece prometedor! – shadyyx

0

Tratando de responder a esto lo mejor de mi conocimiento de Doctrine, que no es mucho porque nunca me ocupé directamente de la hidratación.

El problema con el uso de una matriz como el método de hidratación es que básicamente pierde todos los metadatos que se adjuntaron a la consulta original, sobre todo los nombres de la tabla.

Una solución a esto podría ser escribir su propio método de hidratación que convierta la matriz de nuevo en objetos.

Cuestiones relacionadas