laravel

Consultas manuales / raw en Laravel

A pesar de que Laravel tiene su ORM y Query Builder en algunas ocasiones vamos a necesitar ejecutar consultas “a mano”, es decir, ejecutar una consulta raw o una query manual.

Una desventaja que traen las consultas raw (que reciben la consulta como cadena) es que son propensas a inyecciones SQL, pero con lo que te mostraré hoy podrás hacer consultas raw en Laravel evitando inyecciones SQL.

Sintaxis de DB::select

Voy a mostrarte cómo hacer un select; no un insert, update o delete. Normalmente las consultas más complejas son con select. En fin, la sintaxis es:

DB::select("consulta", ["parámetro", "parámetro2"])

Como ves el primer argumento es la consulta como string. Es importante que no concatenes ningún valor aquí.

El segundo argumento es un arreglo de los valores que se pasarán a la base de datos al momento de ejecutar la query, y que remplazarán a los placeholders de la consulta.

En resumen es como hacer un select con PDO en PHP y especificar los parámetros en lugar de concatenar en una string.

Ejemplo para consulta manual con Laravel

Veamos un ejemplo sencillo; consultar de la tabla alumnos donde el nombre sea “Luis” quedaría así:

<?php
$nombre = "Luis";
$alumnos = DB::select(
    "SELECT nombre FROM alumnos WHERE nombre = ?",
    [
        $nombre
    ]
);

En este caso en lugar de pasar el valor, ponemos un signo de interrogación ?. Después, en el arreglo (que puede ser definido con [] o con array()) pasamos los parámetros en el mismo orden.

Con dos parámetros

Si queda alguna duda de cómo pasar los parámetros de manera posicional, otra consulta quedaría así:

<?php
$nombre = "Luis";
$edad = 22;
$alumnos = DB::select(
    "SELECT nombre FROM alumnos WHERE nombre = ? AND edad = ?",
    [
        $nombre, $edad
    ]
);

Con esto quiero dar a entender que debemos pasar los parámetros dentro del arreglo en el mismo orden que aparecen los signos de interrogación en la consulta.

Ejemplo final

Bien, las consultas de arriba pudieron hacerse con el Query Builder de manera más expresiva. Lo que pasa es que yo necesitaba hacer una consulta un poco más compleja que se ve así:

<?php
$idCurso = $request->get("idCurso");
$alumnos = DB::select(
    "select nombre from alumnos
            where id not in
            (select alumnos.id
            from alumnos
            inner join alumno_curso
            on alumnos.id = alumno_curso.id_alumno
            and alumno_curso.id_curso = ?)",
    [
        $idCurso
    ]
);

Seguramente existe un modo de hacerlo con los métodos que Laravel proporciona, pero estoy feliz de que pueda usar las consultas manuales, crudas o raw sin dejar de usar el framework.

Conclusión

Siempre deberías buscar la manera de usar el query builder y, solo en casos específicos, usar las consultas personalizadas.

No olvides limpiar o sanear tus datos antes de ingresarlos a la base de datos; el método que expliqué funciona perfectamente para evitar inyecciones SQL.

Dejo algunos enlaces para aprender más sobre:

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Entradas recientes

Creador de credenciales web – Aplicación gratuita

Hoy te voy a presentar un creador de credenciales que acabo de programar y que…

1 semana hace

Desplegar PWA creada con Vue 3, Vite y SQLite3 en Apache

Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…

2 semanas hace

Arquitectura para wasm con Go, Vue 3, Pinia y Vite

En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…

2 semanas hace

Vue 3 y Vite: crear PWA (Progressive Web App)

En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…

2 semanas hace

Errores de Comlink y algunas soluciones

Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…

2 semanas hace

Esperar promesa para inicializar Store de Pinia con Vue 3

En este artículo te voy a enseñar cómo usar un "top level await" esperando a…

2 semanas hace

Esta web usa cookies.