2011-09-23 8 views
5

Soy .NET convertido a PHP y hasta ahora estoy pasando un buen rato con la transición. Estoy usando doctrine 1.2 como mi ORM y tengo mis modelos funcionando y todo está bien conectado. Sin embargo, el problema que estoy viendo ahora es que los objetos de salida son enormes. Tengo una tabla bastante simple llamada USUARIOS, probablemente tiene 8 columnas y FK a 4 o 5 otras tablas. Estoy utilizando el código de abajo para hidratar mis objeto USUARIOS:Los objetos de Doctrine son GRANDES

$q = Doctrine_Query::create() 
->select('u.*') 
->from('USERS u') 
->where('u.VANITY_URL = ?',$Url_Frag); 

$users = $q->execute(); 

print_r($users); 

veo el objeto hidratado w/mis datos y eso es bueno. Sin embargo, también viene con lo que parece ser un montón de metadatos que obviamente no necesito. En general, ¡el objeto tiene más de 5000 líneas de longitud! Estoy seguro de que hay un cambio obvio en alguna parte que básicamente dice "solo emite tal y tal información" pero no puedo encontrarlo en el manual de doctrina.

¿Pensamientos?

+0

Use print_r ($ users-> toArray()); Por cierto, tener un objeto de 5000 líneas no es un problema en absoluto. – Zeljko

Respuesta

1

Tiene varias opciones. Una es cambiar a la doctrina2: tiene modelos elegantes, sin ninguna magia de doctrina1.

Los segundos son para cambiar su modo de hidratación. Realmente no se puede modificar el modelo de doctrina o la grosura de un objeto sin cambiar la lógica doctrine_record. Así que esto podría funcionar:

$q = Doctrine_Query::create() 
->select('u.*') 
->from('USERS u') 
->where('u.VANITY_URL = ?',$Url_Frag) 
->setHydrationMode(Doctrine::HYDRATE_ARRAY); 
$users = $q->execute(); 

Print_r'ing estos objetos será hughe, ya que hay muchos objetos anidados en la red de clase doctrina (algunos objetos tienen un poco de la "complejo de Dios" en ellos).

Más documentación se puede encontrar aquí: http://www.doctrine-project.org/documentation/manual/1_2/pl/data-hydrators:core-hydration-methods

1

si no estoy confundiendo, hay algunas referencias círculo en el Doctrine1.2 entidades, por lo print_r o var_dump en ellos no es una buena idea. En realidad, si no tiene algo como Xdebug que limita la profundidad de recursión, nunca obtendrá el resultado en el navegador.

Si realmente le preocupa el consumo de memoria, use la función memory_get_usage para examinar la huella de memoria antes y después de la hidratación.

7

En Doctrine2, hay un método dump() disponible en:

\Doctrine\Common\Util\Debug::dump($var, $maxDepth) 

Se hace un trabajo similar a print_r y var_dump, pero oculta todos los datos relacionados con la Doctrina.

Tal vez hay algo similar para Doctrine 1.x?

6

Doctrine 1.2 entidades objeto y colecciones tiene un método llamado "toArray". Entonces usted puede hacer:

print_r($users->toArray()); 
Cuestiones relacionadas