2011-09-23 2 views
5

Je suis un .NET converti en PHP et je suis en train de passer un bon moment avec la transition. J'utilise la doctrine 1.2 comme ORM et mes modèles fonctionnent et tout est bien connecté. Cependant, le problème que je regarde maintenant est que les objets de sortie sont énormes. J'ai une table assez simple appelée USERS - il a probablement 8 colonnes et FKs à 4 ou 5 autres tables. J'utilise le code ci-dessous pour hydrater mes UTILISATEURS objet:Les objets Doctrine sont ÉNORMES

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

$users = $q->execute(); 

print_r($users); 

Je vois l'objet hydraté w/mes données afin que c'est bon. Cependant, il s'accompagne aussi de ce qui ressemble à un tas de méta-données dont je n'ai évidemment pas besoin. Dans l'ensemble, l'objet est plus de 5000 lignes de plus! Je suis sûr qu'il y a un passage évident quelque part qui dit essentiellement "n'émettent que des données de ce type" mais je ne le trouve pas dans le manuel de doctrine.

Pensées?

+0

Utilisez print_r ($ users-> toArray()); BTW, ayant un objet de 5000 lignes n'est pas un problème du tout. – Zeljko

Répondre

1

Vous avez plusieurs options. L'un est de passer à la doctrine2: il a des modèles lisses, sans aucune magie de la doctrine1.

Les secondes sont de changer votre mode d'hydratation. Vous ne pouvez pas vraiment modifier le modèle de doctrine ou la grosseur d'un objet sans modifier la logique doctrine_record. Donc, cela pourrait fonctionner:

$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 ces objets seront hughe, car il y a beaucoup d'objets imbriqués dans le réseau de classe doctrine (certains objets ont un peu du « complexe dieu » en eux).

documentation DAVANTAGE peuvent être trouvés ici: http://www.doctrine-project.org/documentation/manual/1_2/pl/data-hydrators:core-hydration-methods

1

si je ne me trompe, il y a quelques références circulaires dans les Doctrine1.2 entités, afin print_r ou var_dump sur eux est pas une bonne idée. En fait, si vous n'avez pas quelque chose comme Xdebug qui limite la profondeur de récursivité, vous n'aurez jamais la sortie vers le navigateur.

Si vous êtes vraiment préoccupé par la consommation de mémoire, utilisez la fonction memory_get_usage pour examiner l'empreinte mémoire avant et après l'hydratation.

7

En Doctrine2, il existe une méthode dump() disponible à:

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

Il fait un travail similaire à print_r et var_dump, mais cache toutes les données relatives à la doctrine.

Peut-être qu'il y a quelque chose de similaire pour Doctrine 1.x?

6

L'objet et les collections d'entités Doctrine 1.2 ont une méthode nommée "toArray". Donc, vous pouvez faire:

print_r($users->toArray()); 
Questions connexes