2012-08-08 7 views
0

Je travaille avec des objets Entity à partir de requêtes Doctrine et je me retrouve avec un très grand tableau, avec toutes les informations de toutes les entités liées. Cela finit par être un énorme arbre de données ... comment puis-je limiter cela? Évitez d'énumérer toutes les données de toutes les relations?Doctrine/Symfony 2: Entités avec trop de relations

+0

Je ne sais pas si ça aide, mais vous pouvez essayer de faire '-> getResult (Doctrine \ ORM \ query :: HYDRATE_ARRAY)' à la fin d'une requête , les résultats seront retournés sous la forme d'un tableau – Gigala

Répondre

1

Vous pouvez toujours supprimer les associations inutiles (il s'agit d'une bonne pratique pour accélérer Doctrine). Vous pouvez également sélectionner uniquement les champs que vous avez besoin dans votre couche de présentation (en lecture seule des données):

public function getAll() 
{ 
    $qb = $this->createQueryBuilder('u'); // Where are in User custom repository 

    return $qb 
     ->select(array('u.id', 'u.first', 'u.last')) 
     ->getQuery() 
      ->getResult(); 
} 

Si vous avez besoin de travailler avec des objets (ou pour les requêtes complexes, qui nécessite SQL ordinaire) une possibilité Filling seulement les propriétés nécessaires (et éventuellement, les associations/collections imbriquées) de votre objet domaine.

Un exemple, plus sur native SQL: (?)

public function getAll() 
{ 
    $mapping = new \Doctrine\ORM\Query\ResultSetMapping(); 

    $mapping->addEntityResult('Acme\HelloBundle\User', 'e'); 

    $mapping->addFieldResult('e', 'id', 'id'); 
    $mapping->addFieldResult('e', 'first', 'first'); 
    $mapping->addFieldResult('e', 'last', 'last'); 

    $sql = "SELECT id, first, last FROM user "; 

    $result = $this->_em->createNativeQuery($sql, $mapping)->getResult(); 

    // Or hust return $result itself (array) 
    return new \Doctrine\Common\Collections\ArrayCollection($result); 
} 

Bien sûr, le disadvance est l'utilisation de SQL natif. Je ne crois pas que ResultSetMapping peut être utilisé avec DQL.

EDIT: jetez un oeil à http://docs.doctrine-project.org/projects/doctrine-orm/en/2.0.x/reference/best-practices.html

+0

Je cherche un moyen simple de désactiver le chargement paresseux dans Doctrine, ou, obtenir une profondeur maximale de relation. C'est possible? – vinnylinux

+0

@vinnylinux si je le rappelle correctement, le chargement paresseux est quand vous sélectionnez un sous-ensemble de données et puis, lors de l'accès aux propriétés ou associations non chargées, doctrine chargera (à une requête supplémentaire) toutes les données pour vous. Donc, le chargement paresseux est une bonne chose. Comme je l'ai dit, cela dépend. À quoi servent les données? – gremo

+0

Ce n'est certainement pas une bonne chose quand vous sérialisez des données avec quelque chose comme le bundle JMSSerializer. Testez-vous avec un ensemble de données raisonnablement volumineux avec diverses relations. Ça commence à se répéter. – vinnylinux

Questions connexes