Guía del query builder de Laravel a partir de DB::table(), desde lo básico hasta usos avanzados. Aprende a construir SQL directamente sin Eloquent y cuándo conviene una u otra opción.
El query builder de Laravel es un mecanismo para construir y ejecutar consultas de base de datos mediante una interfaz fluida. Se parte de DB::table() y se encadenan métodos para armar la consulta.
use Illuminate\Support\Facades\DB;$users = DB::table('users')->get();
Internamente utiliza binding de parámetros de PDO, así que la protección contra inyecciones SQL es automática.
El query builder funciona con todas las bases de datos soportadas por Laravel (MySQL, MariaDB, PostgreSQL, SQLite, SQL Server). Puedes cambiar de motor sin modificar el código.
// Primer registro (null si no lo encuentra)$user = DB::table('users')->where('name', 'Ana García')->first();// Lanza excepción (respuesta 404 automática) si no lo encuentra$user = DB::table('users')->where('name', 'Ana García')->firstOrFail();// Solo el valor de una columna$email = DB::table('users')->where('name', 'Ana García')->value('email');// Búsqueda por ID$user = DB::table('users')->find(3);
// Colección con los valores de email$emails = DB::table('users')->pluck('email');// Colección asociativa: name → email$emailByName = DB::table('users')->pluck('email', 'name');
use Illuminate\Support\Collection;// Procesar en bloques de 100DB::table('users')->orderBy('id')->chunk(100, function (Collection $users) { foreach ($users as $user) { // Procesar... }});// Cuando modificas datos durante el chunk, usa chunkByIdDB::table('users')->where('active', false) ->chunkById(100, function (Collection $users) { foreach ($users as $user) { DB::table('users') ->where('id', $user->id) ->update(['active' => true]); } });
Si actualizas o eliminas registros durante el chunk, usa chunkById() en lugar de chunk(). Con chunk() podrían saltarse registros.
use Illuminate\Database\Query\Builder;// Agrupar OR y combinarlo con AND$users = DB::table('users') ->where('active', true) ->where(function (Builder $query) { $query->where('role', 'admin') ->orWhere('role', 'moderator'); }) ->get();// WHERE active = 1 AND (role = 'admin' OR role = 'moderator')
whereNullSafeEquals y orWhereNullSafeEquals comparan una columna con un valor tratando dos NULL como iguales.Con el operador = normal, NULL = NULL es false; en cambio whereNullSafeEquals considera NULL igual a NULL. Se corresponde con <=> en MySQL y con IS NOT DISTINCT FROM en PostgreSQL.
$lastLoginIp = $request->input('last_login_ip');// Aunque $lastLoginIp sea null, encuentra los usuarios con last_login_ip IS NULL$users = DB::table('users') ->whereNullSafeEquals('last_login_ip', $lastLoginIp) ->get();
where('column', null) se convierte en WHERE column IS NULL, pero whereNullSafeEquals('column', $value) se comporta de la misma manera independientemente de que el valor bindeado sea null o no. Es especialmente útil cuando el valor de entrada del usuario puede ser null.
Las expresiones Raw se insertan literalmente en la consulta. Nunca pases datos del usuario directamente: usa siempre bindings para evitar inyecciones SQL.
// Con condición$deleted = DB::table('users')->where('status', 'inactive')->delete();// Vaciar toda la tabla (resetea el auto-incremental)DB::table('users')->truncate();
// Ver la SQL generada$sql = DB::table('users')->where('active', true)->toSql();// "select * from `users` where `active` = ?"// SQL y bindings$bindings = DB::table('users')->where('active', true)->getBindings();// Ejecuta y muestra la query, y continúaDB::table('users')->where('active', true)->dump();// Ejecuta, muestra la query y terminaDB::table('users')->where('active', true)->dd();
dd() es útil en depuración, pero no lo uses jamás en producción. toSql() y getBindings() son opciones seguras.
El query builder es más bajo nivel: devuelve stdClass en lugar de instancias de modelo.
Cuando no necesitas relaciones ni observers, el query builder es más sencillo y rápido.