raw query nativo inner php sql doctrine

php - query - sql symfony



Ejecute SQL sin formato con Doctrine 2 (8)

Cómo ejecutar una consulta en bruto y devolver los datos.

Enganche a su gerente y haga 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'']);

Quiero ejecutar SQL sin procesar usando Doctrine 2

Necesito truncar las tablas de la base de datos e inicializar las tablas con los datos de prueba predeterminados.


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


Descubrí que la respuesta es probablemente:

Una NativeQuery le permite ejecutar SQL nativo, mapeando los resultados de acuerdo con sus especificaciones. Tal especificación que describe cómo un conjunto de resultados SQL se asigna a un resultado de Doctrine se representa mediante un ResultSetMapping.

Fuente: Native SQL .


En su modelo, cree la instrucción SQL sin formato (el ejemplo a continuación es un ejemplo de un intervalo de fecha que tuve que usar, pero sustituyo el suyo. Si está realizando una SELECCIÓN, agregue -> fetchall () a la llamada a execute ().

$sql = "DELETE FROM tmp WHERE lastedit + INTERVAL ''5 minute'' < NOW() "; $stmt = $this->getServiceLocator() ->get(''Doctrine/ORM/EntityManager'') ->getConnection() ->prepare($sql); $stmt->execute();


Lo hice funcionar al hacer esto, suponiendo 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 ajuste a sus necesidades.


No se puede, Doctrine 2 no permite consultas sin formato. Puede parecer que puedes, pero si intentas algo como esto:

$sql = "SELECT DATE_FORMAT(whatever.createdAt, ''%Y-%m-%d'') FORM whatever..."; $em = $this->getDoctrine()->getManager(); $em->getConnection()->exec($sql);

Doctrine escupe un error que dice que DATE_FORMAT es una función desconocida.

Pero mi base de datos (mysql) 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 entiende, considerando que la consulta no es válida.

Entonces, si como yo desea simplemente enviar una cadena a la base de datos y dejar que se ocupe de ella (y dejar que el desarrollador asuma la responsabilidad total de la seguridad), olvídese de ella.

Por supuesto, puede codificar una extensión para permitir eso de una manera u otra, pero le conviene usar mysqli para hacerlo y dejar Doctrine en su negocio ORM.


Yo tuve el mismo problema. Desea buscar el objeto de conexión proporcionado por el administrador de la entidad:

$conn = $em->getConnection();

A continuación, puede consultar / ejecutar directamente en su contra:

$statement = $conn->query(''select foo from bar''); $num_rows_effected = $conn->exec(''update bar set foo=1'');

Consulte los documentos para el objeto de conexión en http://www.doctrine-project.org/api/dbal/2.0/doctrine/dbal/connection.html


//$sql - sql statement //$em - entity manager $em->getConnection()->exec( $sql );