El método DB::raw()
en Laravel se utiliza para ejecutar expresiones SQL crudas (raw) en consultas. Permite realizar consultas avanzadas que no se pueden expresar fácilmente usando los métodos del constructor de consultas (Query Builder). DB::raw()
es especialmente útil cuando necesitas usar funciones de la base de datos, realizar cálculos o consultas complejas directamente en SQL.
DB::raw()
en Laravel
DB::raw()
toma una cadena SQL como argumento y la inserta directamente en la consulta, sin ningún procesamiento adicional. Al usar DB::raw()
, Laravel entiende que estás ejecutando una instrucción SQL personalizada, lo que permite utilizarlo dentro de métodos como select()
, whereRaw()
, orderByRaw()
, havingRaw()
, entre otros.
use Illuminate\Support\Facades\DB;
$users = DB::table('users')
->select(DB::raw('COUNT(*) as total_users'))
->get();
En este ejemplo, DB::raw('COUNT(*) as total_users')
ejecuta la función SQL COUNT()
para contar todos los usuarios y devuelve el resultado en una columna llamada total_users
.
DB::raw()
1. Uso de DB::raw()
para seleccionar columnas con funciones SQL:
$users = DB::table('users')
->select('name', DB::raw('YEAR(created_at) as year_joined'))
->get();
En este ejemplo, DB::raw('YEAR(created_at) as year_joined')
extrae el año de la columna created_at
y lo muestra con el alias year_joined
.
2. Uso de DB::raw()
en condiciones whereRaw()
:
$users = DB::table('users')
->whereRaw('LENGTH(name) > 5')
->get();
Aquí, whereRaw('LENGTH(name) > 5')
filtra a los usuarios cuyos nombres tienen más de 5 caracteres, utilizando la función LENGTH()
de SQL.
3. Realizar cálculos en la consulta:
$sales = DB::table('orders')
->select(DB::raw('SUM(amount) - SUM(discount) as net_sales'))
->get();
Esta consulta calcula las ventas netas restando el total de discount
al total de amount
usando DB::raw()
.
4. Ordenar resultados con orderByRaw()
:
$products = DB::table('products')
->orderByRaw('LENGTH(name) DESC')
->get();
En este caso, orderByRaw('LENGTH(name) DESC')
ordena los productos en función de la longitud de sus nombres, en orden descendente.
5. Usar DB::raw()
en la cláusula havingRaw()
:
$products = DB::table('products')
->select('category', DB::raw('SUM(price) as total_sales'))
->groupBy('category')
->havingRaw('total_sales > 1000')
->get();
Aquí, havingRaw('total_sales > 1000')
filtra las categorías cuya suma de precios (total_sales
) es mayor a 1000.
6. Concatenar columnas y cadenas con DB::raw()
:
$users = DB::table('users')
->select(DB::raw("CONCAT(first_name, ' ', last_name) as full_name"))
->get();
Esta consulta concatena las columnas first_name
y last_name
con un espacio intermedio y devuelve el resultado con el alias full_name
.
7. Usar subconsultas con DB::raw()
:
$users = DB::table('users')
->select('id', 'name', DB::raw('(SELECT COUNT(*) FROM orders WHERE orders.user_id = users.id) as orders_count'))
->get();
La subconsulta SELECT COUNT(*) FROM orders WHERE orders.user_id = users.id
cuenta el número de pedidos (orders
) que tiene cada usuario, y se muestra como orders_count
.
DB::raw()
Es importante tener en cuenta que al usar DB::raw()
, se está insertando SQL directamente en la consulta, lo que podría abrir puertas a inyecciones SQL si los datos no se validan correctamente. Para evitar problemas de seguridad:
?
) o métodos seguros como where()
, select()
y otros métodos del Query Builder, en lugar de concatenar valores directamente en DB::raw()
.
$value = 'admin';
$users = DB::table('users')
->whereRaw('role = ?', [$value])
->get();
En este ejemplo, el parámetro ?
evita inyecciones SQL al enlazar los valores de manera segura.
Para más detalles sobre el uso de DB::raw()
en Laravel, consulta la documentación oficial de Laravel.
Jorge García
Fullstack developer