2011-02-25 28 views
8

que estoy tratando de hacer una consulta nativa con Doctrine 2 .. pero no puedo hacer que funciona ..Doctrina 2, nativo de consulta

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

Esto está regresando matriz vacía .. No estoy seguro de cómo funciona "ResultSetMapping", pero no puede asignar nada con esta consulta como he visto en los ejemplos en el sitio web doctrina, porque user_recent_activity que no es una mesa, es una vista como esta:

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

Identificación representan diferentes objetos, por lo que, no son clave externa ..

Entonces, ¿es posible hacer una consulta normal a Doctrine 2? .. Me estoy volviendo loca ..

Gracias

+0

Si se ha resuelto el problema, por favor, marca su pregunta para el cierre o proporcionar y aceptar una respuesta que resume su solución. –

Respuesta

6

No debería ser un problema si su una vista o tabla A medida que se filas y columnas de la consulta.

Debe asignar los resultados a las entidades para las consultas sql nativas utilizando 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'); 

Y usted debe tener la entidad adecuada también.

Puede consultar http://www.doctrine-project.org/docs/orm/2.0/en/reference/native-sql.html para obtener ejemplos más detallados.

UPDATE:

En el caso de puntos de vista que contiene resultados de más de 1 mesa, método addJoinedEntityResult() se puede utilizar para mapear los resultados a sus respectivas entidades. Debe definir las entidades en consecuencia y asignar los resultados a sus campos.

Este método probablemente termine con objetos parciales, por lo que debe usarse con cuidado para evitar daños en los datos.

información sobre los objetos parciales: http://www.doctrine-project.org/docs/orm/2.0/en/reference/partial-objects.html

+0

El problema es que, al igual que una vista, no puse el identificador/clave principal, la identificación que ve en la tabla, es la identificación de otra tabla ... así que no puedo usar una entidad. Tal vez no es posible recibir una matriz normal. .. Tal vez solo debo poner una clave principal y olvidarme del problema ... incluso yo no necesitaría la llamada de nativeQuery ... pero es una solución poco fea. Gracias por tu tiempo. – Raul

+0

Hmm, en ese caso puede definir las entidades relacionadas y usar el método addJoinedEntityResult para asignar la información a sus entidades. Hay ejemplos de eso en http://www.doctrine-project.org/docs/orm/2.0/en/reference/native-sql.html # ejemplos. No estoy seguro si eso funcionará bien. Puede lograr el mismo resultado sin las vistas con Doctrine, pero no sé cuál ofrece el mejor rendimiento, no es un experto en el área. –

+0

Después de pensarlo más, el método addJoinedEntityResult debería funcionar ya que a Doctrine no le importa la naturaleza de la consulta con SQL nativo, solo le importa cómo se asigna a las entidades. Actualizó la respuesta en consecuencia. –

1

Otra posibilidad para su problema es utilizar consultas nativos en conjunto con los resultados escalares. Para obtener más información, consulte el enlace this, párrafo 12.2.4. Espero ser útil.

1

en busca de una hilera

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

a buscar varias filas

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

Aquí usar consulta SQL nativo en lugar del $ sql anteriormente.

Cuestiones relacionadas