2011-02-25 24 views
8

Sto cercando di fare una query nativa con Doctrine 2 .. ma non riesco a fare funziona ..Doctrine 2, Native Query

$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(); 

Questo sta tornando array vuoto .. non sono sicuro di come funziona "ResultSetMapping", ma non posso Mappa nulla con questa query come ho visto in esempi in sito dottrina, perché user_recent_activity non è un tavolo, è una vista come questa:

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 rappresentano oggetti diversi, quindi, non sono la chiave esterna ..

Quindi, è possibile solo fare una query normale a Doctrine 2 ?? .. Sto diventando pazzo ..

Grazie

+0

Se il problema è stato risolto, contrassegnare la domanda per la chiusura o fornire e accettare una risposta che delinea la soluzione. –

risposta

6

Non dovrebbe essere un problema se una vista o una tabella come si ottiene righe e colonne dalla query.

È necessario associare i risultati alle entità per query SQL native utilizzando 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'); 

E si dovrebbe avere anche l'entità appropriata.

È possibile controllare http://www.doctrine-project.org/docs/orm/2.0/en/reference/native-sql.html per esempi più dettagliati.

UPDATE:

In caso di visite che contiene risultati di oltre 1 tavolo, metodo addJoinedEntityResult() può essere utilizzato per mappare i risultati alle rispettive entità. È necessario definire le entità di conseguenza e mappare i risultati nei loro campi.

Questo metodo probabilmente finirà con oggetti parziali, quindi dovrebbe essere usato con attenzione per evitare il danneggiamento dei dati.

informazioni sugli oggetti parziali: http://www.doctrine-project.org/docs/orm/2.0/en/reference/partial-objects.html

+0

Il problema, è che come è una vista, non ho messo l'identificatore/chiave primaria, l'id che vedi nella tabella, sono l'id di un'altra tabella .. quindi non posso usare un'entità. Forse non è possibile ricevere un array normale? .. Forse devo solo mettere una chiave primaria e dimenticare il problema .. anche io non avrei bisogno della chiamata nativeQuery .. ma è una soluzione poco brutta. Grazie per il tuo tempo. – Raul

+0

Hmm, in tal caso è possibile definire le entità correlate e utilizzare il metodo addJoinedEntityResult per mappare le informazioni alle loro entità. Ci sono esempi su http://www.doctrine-project.org/docs/orm/2.0/en/reference/native-sql.html # esempi. Non sono sicuro che funzionerà comunque. È possibile ottenere lo stesso risultato senza le viste con Doctrine, ma non so quale si ottiene la migliore prestazione, non un esperto nell'area. –

+0

Dopo aver riflettuto meglio, il metodo addJoinedEntityResult dovrebbe funzionare come Doctrine non si preoccupa della natura della query con SQL nativo, si preoccupa solo di come è mappato alle entità. Aggiornato di conseguenza la risposta. –

1

Altra possibilità per il vostro problema è quello di utilizzare le query nativi in ​​combinazione con risultati scalari. Per maggiori informazioni, guarda il link this, paragrafo 12.2.4. Spero di essere utile.

1

per andare a prendere singola riga

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

per recuperare più righe

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

Qui utilizzare query SQL nativo al posto di $ sopra sql.