2011-02-25 5 views
8

Je suis en train de faire une requête native avec Doctrine 2 .. mais je ne peux pas faire cela fonctionne ..Doctrine 2, natif de requête

$q = "SELECT * FROM user_recent_activity WHERE id = {$user->id}"; 
$rsm = new \Doctrine\ORM\Query\ResultSetMapping; 
$query = $this->_em->createNativeQuery($q, $rsm); 
$result = $query->getResult(); 

Ce retourne un tableau vide .. Je ne suis pas vous comment cela fonctionne « resultSetMapping », mais je ne peux pas la carte rien avec cette requête comme je l'ai vu dans les exemples dans le site Web de la doctrine, parce que user_recent_activity ce n'est pas une table, il est une vue comme celui-ci:

id user_id type  created_at 
12 5  opinion 2011-02-22 23:29:00 
2 2  vote  2011-01-30 14:16:51 

id représentent différents objets, donc, ne sont pas des clés étrangères ..

Alors, est-il possible de faire une requête normale à Doctrine 2? .. Je deviens fou ..

Merci

+0

Si vous avez résolu votre problème, veuillez marquer votre question pour la fermeture ou fournir et accepter une réponse qui décrit votre solution. –

Répondre

6

Il ne devrait pas être un problème si sa vue ou de la table que vous obtenez des lignes et des colonnes de votre requête.

Vous devez mapper les résultats aux entités pour les requêtes SQL natives à l'aide de rsm.

$rsm->addEntityResult('UserRecentActivity', 'u'); 
$rsm->addFieldResult('u', 'id', 'id'); 
$rsm->addFieldResult('u', 'user_id', 'user_id'); 
$rsm->addFieldResult('u', 'type', 'type'); 
$rsm->addFieldResult('u', 'created_at', 'created_at'); 

Et vous devriez avoir l'entité appropriée aussi bien.

Vous pouvez vérifier http://www.doctrine-project.org/docs/orm/2.0/en/reference/native-sql.html pour des exemples plus détaillés. méthode peut être utilisée pour cartographier les résultats à leurs entités respectives

Dans le cas d'une vue qui contient les résultats de plus d'une table, addJoinedEntityResult():

UPDATE. Vous devez définir les entités en conséquence et mapper les résultats à leurs champs.

Cette méthode se terminera probablement avec des objets partiels, elle doit donc être utilisée avec précaution pour éviter la corruption de données.

Informations sur les objets partiels: http://www.doctrine-project.org/docs/orm/2.0/en/reference/partial-objects.html

+0

Le problème, c'est que comme est une vue, je n'ai pas mis identificateur/clé primaire, l'ID que vous voyez dans la table, sont l'ID de l'autre table .. donc je ne peux pas utiliser une entité. Peut-être n'est pas possible de recevoir juste un tableau normal? .. Peut-être que je dois juste mettre une clé primaire et oublier le problème .. même je n'aurais pas besoin de l'appel nativeQuery .. mais c'est peu de solution laide. Merci pour votre temps. – Raul

+0

Hmm, dans ce cas, vous pouvez définir les entités associées et utiliser la méthode addJoinedEntityResult pour mapper les informations sur leurs entités. Il y a des exemples à cela sur http://www.doctrine-project.org/docs/orm/2.0/fr/reference/native-sql.html # exemples. Je ne suis pas sûr que cela fonctionnera bien. Vous pouvez obtenir le même résultat sans les vues avec Doctrine, mais je ne sais pas lequel donne la meilleure performance, pas un expert dans le domaine. –

+0

Après y avoir réfléchi, la méthode addJoinedEntityResult devrait fonctionner car Doctrine ne se soucie pas de la nature de la requête avec le SQL natif, se soucie seulement de la manière dont elle est mappée aux entités. Mis à jour la réponse en conséquence. –

1

Autre possibilité pour votre problème est d'utiliser des requêtes autochtones conjointement avec les résultats scalaires. Pour plus d'informations, voir le lien this, paragraphe 12.2.4. J'espère être utile.

1

Pour récupérer seule ligne

$result = $this->_em->getConnection()->fetchAssoc($sql) 

Pour récupérer plusieurs lignes

$result = $this->_em->getConnection()->fetchAll($sql) 

utiliser ici requête SQL native en place de $ sql ci-dessus.