Respuestas:
Aquí hay un ejemplo de una consulta sin formato en Doctrine 2 que estoy haciendo:
public function getAuthoritativeSportsRecords()
{
$sql = "
SELECT name,
event_type,
sport_type,
level
FROM vnn_sport
";
$em = $this->getDoctrine()->getManager();
$stmt = $em->getConnection()->prepare($sql);
$stmt->execute();
return $stmt->fetchAll();
}
...getConnection()->query($sql);
y no tuve que correr$stmt->execute();
EntityManagerInterface $entityManager
y luego llamar a$entityManager->getConnection()
//$sql - sql statement
//$em - entity manager
$em->getConnection()->exec( $sql );
Lo hice funcionar haciendo esto, asumiendo que estás usando PDO.
//Place query here, let's say you want all the users that have blue as their favorite color
$sql = "SELECT name FROM user WHERE favorite_color = :color";
//set parameters
//you may set as many parameters as you have on your query
$params['color'] = blue;
//create the prepared statement, by getting the doctrine connection
$stmt = $this->entityManager->getConnection()->prepare($sql);
$stmt->execute($params);
//I used FETCH_COLUMN because I only needed one Column.
return $stmt->fetchAll(PDO::FETCH_COLUMN);
Puede cambiar el FETCH_TYPE para que se adapte a sus necesidades.
Conéctese a su gerente y establezca una nueva conexión:
$manager = $this->getDoctrine()->getManager();
$conn = $manager->getConnection();
Crea tu consulta y fetchAll:
$result= $conn->query('select foobar from mytable')->fetchAll();
Obtenga los datos del resultado de esta manera:
$this->appendStringToFile("first row foobar is: " . $result[0]['foobar']);
Descubrí que la respuesta es probablemente:
Un NativeQuery le permite ejecutar SQL nativo, mapeando los resultados de acuerdo con sus especificaciones. Una especificación de este tipo que describe cómo se asigna un conjunto de resultados de SQL a un resultado de Doctrine se representa mediante un ResultSetMapping.
Fuente: SQL nativo .
Yo tuve el mismo problema. Desea buscar el objeto de conexión proporcionado por el administrador de la entidad:
$conn = $em->getConnection();
Luego puede consultar / ejecutar directamente contra él:
$statement = $conn->query('select foo from bar');
$num_rows_effected = $conn->exec('update bar set foo=1');
Consulte los documentos del objeto de conexión en http://www.doctrine-project.org/api/dbal/2.0/doctrine/dbal/connection.html
En su modelo, cree la declaración SQL sin procesar (el ejemplo a continuación es un ejemplo de un intervalo de fechas que tuve que usar, pero sustituya el suyo. Si está haciendo un SELECT, agregue -> fetchall () a la llamada execute ().
$sql = "DELETE FROM tmp
WHERE lastedit + INTERVAL '5 minute' < NOW() ";
$stmt = $this->getServiceLocator()
->get('Doctrine\ORM\EntityManager')
->getConnection()
->prepare($sql);
$stmt->execute();
No puedes, Doctrine 2 no permite consultas sin formato. Puede parecer que puede, pero si intenta algo como esto:
$sql = "SELECT DATE_FORMAT(whatever.createdAt, '%Y-%m-%d') FORM whatever...";
$em = $this->getDoctrine()->getManager();
$em->getConnection()->exec($sql);
Doctrine escupirá un error diciendo que DATE_FORMAT es una función desconocida.
Pero mi base de datos (mysql) sí conoce esa función, así que básicamente lo que está sucediendo es que Doctrine está analizando esa consulta detrás de escena (y detrás de tu espalda) y encuentra una expresión que no comprende, considerando que la consulta no es válida.
Entonces, si, como yo, desea poder simplemente enviar una cadena a la base de datos y dejar que se ocupe de ella (y dejar que el desarrollador asuma toda la responsabilidad por la seguridad), olvídelo.
Por supuesto, podría codificar una extensión para permitir eso de una forma u otra, pero es mejor usar mysqli para hacerlo y dejar Doctrine a su negocio ORM.
mysqldump
s o cargar datos de volcados anteriores o eliminar tablas, generalmente escribo un script de shell para ese trabajo y luego escribo una tarea (o "comando", en lenguaje Symfony2 ) que ejecuta el script de shell. El propósito de un ORM, según tengo entendido, es abstraer el trabajo repetitivo, y si estás haciendo algo como truncar una tabla, no veo cómo tendría sentido traer a Doctrine al cuadro, ya que Doctrine no lo hace. Para facilitar esa tarea.