Cómo ejecutar SQL plano usando Doctrine en Symfony 3

DQL como lenguaje de consulta tiene construcciones SELECT, UPDATE y DELETE que se asignan a sus correspondientes tipos de instrucciones SQL.

Sin embargo, hay muchas declaraciones, como insertar, que no están permitidas (o no existen) en DQL, porque las entidades y sus relaciones deben introducirse en el contexto de persistencia a través de EntityManager para garantizar la coherencia de su modelo de objetos.

Básicamente, si desea usar sql simple para insertar información en su base de datos, está tirando el modelo a la basura ... sin embargo, la función de usar sql simple es útil si tiene consultas realmente complicadas que no pueden ser logrado usando DQL por muchas razones (difícil o no hay extensiones de doctrina disponibles para usar funciones personalizadas, etc.).

En este artículo aprenderá cómo ejecutar una consulta SQL simple usando doctrina en Symfony 3 fácilmente.

Uso

Para ejecutar una consulta sql sin procesar, necesitamos obtener acceso a la base de datos utilizando la conexión de doctrine. Puede recuperar la conexión predeterminada del administrador de la entidad.

El siguiente ejemplo muestra cómo usar una consulta sql simple desde un controlador Symfony:

<?php 

class LandingController extends Controller
{
    public function indexAction(Request $request)
    {
        $em = $this->getDoctrine()->getManager();

        $RAW_QUERY = 'SELECT * FROM my_table where my_table.field = 1 LIMIT 5;';
        
        $statement = $em->getConnection()->prepare($RAW_QUERY);
        $statement->execute();

        $result = $statement->fetchAll();
    }
}

La variable $result debe contener una matriz asociativa con 5 filas de la base de datos.

Parámetros de enlace

De la misma manera que lo hace el constructor de consultas de doctrine, puede establecer parámetros para su consulta utilizando el bindValuemétodo en su declaración para hacer sus consultas más dinámicas.

<?php 

class LandingController extends Controller
{
    public function indexAction(Request $request)
    {
        $em = $this->getDoctrine()->getManager();

        $RAW_QUERY = 'SELECT * FROM my_table where my_table.field = :status LIMIT 5;';
        
        $statement = $em->getConnection()->prepare($RAW_QUERY);
        // Set parameters 
        $statement->bindValue('status', 1);
        $statement->execute();

        $result = $statement->fetchAll();
    }
}

Varias bases de datos

Como trabaja con múltiples bases de datos , naturalmente tiene más de un administrador. Como se mencionó anteriormente, solo obtenga la conexión del administrador de la entidad que apunta a la base de datos que desea consultar.

<?php 

class LandingController extends Controller
{
    public function indexAction(Request $request)
    {
        // Get connections
        $DatabaseEm1 = $this->getDoctrine()->getManager('database_or_connection_name1');
        $DatabaseEm2 = $this->getDoctrine()->getManager('database_or_connection_name2');

        // Write your raw SQL
        $rawQuery1 = 'SELECT * FROM my_table where my_table.field = :status LIMIT 10;';
        $rawQuery2 = 'SELECT * FROM my_table where my_table.field = :text LIMIT 5;';

        // Prepare the query from DATABASE1
        $statementDB1 = $DatabaseEm1->getConnection()->prepare($rawQuery1);
        $statementDB1->bindValue('status', 1);

        // Prepare the query from DATABASE2
        $statementDB2 = $DatabaseEm2->getConnection()->prepare($rawQuery2);
        $statementDB2->bindValue('text', 'Hello World');

        // Execute both queries
        $statementDB1->execute();
        $statementDB2->execute();

        // Get results :)
        $resultDatabase1 = $statementDB1->fetchAll();
        $resultDatabase2 = $statementDB2->fetchAll();
    }
}

Que te diviertas ❤️!

Esto podria interesarte

Conviertete en un programador más sociable