- Introducción
- Selects
- Joins
- Wheres avanzados
- Agregados
- Expresiones planas
- Inserts
- Updates
- Deletes
- Unions
- Bloqueo pesimista
- Cache de consultas
El constructor de consulta de base de datos ofrece una cómoda, conveniente y fluída forma para crear y ejecutar consultas de base de datos. Puede ser usado para ejecutar la mayoría de las operaciones con la base de datos en tu aplicación, y funciona en todos los motores de base de datos soportados.
Nota: El constructor de consultas de Laravel usa vinculación de parámetros PDO en todas las consultas para proteger tu aplicación de ataques de inyección de SQL. No hay necesidad de limpiar las cadenas de texto que son pasadas como vínculos.
$users = DB::table('users')->get();
foreach ($users as $user)
{
var_dump($user->name);
}
$user = DB::table('users')->where('name', 'John')->first();
var_dump($user->name);
$name = DB::table('users')->where('name', 'John')->pluck('name');
$roles = DB::table('roles')->lists('title');
Éste método retornará una rreglo de títulos de roles. Puedes también especificar un índice de una columna personalizada para el arreglo retornado:
$roles = DB::table('roles')->lists('title', 'name');
$users = DB::table('users')->select('name', 'email')->get();
$users = DB::table('users')->distinct()->get();
$users = DB::table('users')->select('name as user_name')->get();
$query = DB::table('users')->select('name');
$users = $query->addSelect('age')->get();
$users = DB::table('users')->where('votes', '>', 100)->get();
$users = DB::table('users')
->where('votes', '>', 100)
->orWhere('name', 'John')
->get();
$users = DB::table('users')
->whereBetween('votes', array(1, 100))->get();
$users = DB::table('users')
->whereNotBetween('votes', array(1, 100))->get();
$users = DB::table('users')
->whereIn('id', array(1, 2, 3))->get();
$users = DB::table('users')
->whereNotIn('id', array(1, 2, 3))->get();
$users = DB::table('users')
->whereNull('updated_at')->get();
$users = DB::table('users')
->orderBy('name', 'desc')
->groupBy('count')
->having('count', '>', 100)
->get();
$users = DB::table('users')->skip(10)->take(5)->get();
El constructor de consultras puede además ser usado para escribir sentencias JOIN. Mira los siguientes ejemplos:
DB::table('users')
->join('contacts', 'users.id', '=', 'contacts.user_id')
->join('orders', 'users.id', '=', 'orders.user_id')
->select('users.id', 'contacts.phone', 'orders.price')
->get();
DB::table('users')
->leftJoin('posts', 'users.id', '=', 'posts.user_id')
->get();
Puedes también crear sentencias JOIN más avanzadas:
DB::table('users')
->join('contacts', function($join)
{
$join->on('users.id', '=', 'contacts.user_id')->orOn(...);
})
->get();
Si deseas usar una sentencia estilo "where" en tus sentencias JOIN, puedes usar el método where
y orWhere
en el método join
. En vez de comparar dos columnas, estos métodos compararán la columna contra un valor:
DB::table('users')
->join('contacts', function($join)
{
$join->on('users.id', '=', 'contacts.user_id')
->where('contacts.user_id', '>', 5);
})
->get();
Algunas veces puedes necesitar la ccreación de sentencias where más avanzadas como "where exists" o agrupar jerarquicamente parámetros. El constructor de consultas de Laravel pueden manejar esto también:
DB::table('users')
->where('name', '=', 'John')
->orWhere(function($query)
{
$query->where('votes', '>', 100)
->where('title', '<>', 'Admin');
})
->get();
La consulta anterior generará la siguiente consulta SQL:
select * from users where name = 'John' or (votes > 100 and title <> 'Admin')
DB::table('users')
->whereExists(function($query)
{
$query->select(DB::raw(1))
->from('orders')
->whereRaw('orders.user_id = users.id');
})
->get();
La consulta anterior generará la siguiente consulta SQL:
select * from users
where exists (
select 1 from orders where orders.user_id = users.id
)
En constructor de consultas además ofrece una variedad de métodos de agregación, como count
, max
, min
, avg
y sum
.
$users = DB::table('users')->count();
$price = DB::table('orders')->max('price');
$price = DB::table('orders')->min('price');
$price = DB::table('orders')->avg('price');
$total = DB::table('users')->sum('votes');
Algunas veces puedes necesitar el uso de expresiones planas en una consulta. Dichas expresiones serán inyectadas dentro de la consulta como cadenas de texto, así que ten cuidado de no crear algún punto débil para inyecciones SQL! Para crear una expresión plana, puedes usar el método DB::raw
:
$users = DB::table('users')
->select(DB::raw('count(*) as user_count, status'))
->where('status', '<>', 1)
->groupBy('status')
->get();
DB::table('users')->increment('votes');
DB::table('users')->increment('votes', 5);
DB::table('users')->decrement('votes');
DB::table('users')->decrement('votes', 5);
You may also specify additional columns to update:
DB::table('users')->increment('votes', 1, array('name' => 'John'));
DB::table('users')->insert(
array('email' => '[email protected]', 'votes' => 0)
);
Si las tablas tienen un ID autoincrementable, usa el método insertGetId
para insertar una fila y retornar el ID:
$id = DB::table('users')->insertGetId(
array('email' => '[email protected]', 'votes' => 0)
);
Nota: Cuando estés usando PostgreSQL el método
insertGetId
espera que la columna autoincrementable se llame "id".
DB::table('users')->insert(array(
array('email' => '[email protected]', 'votes' => 0),
array('email' => '[email protected]', 'votes' => 0),
));
DB::table('users')
->where('id', 1)
->update(array('votes' => 1));
DB::table('users')->where('votes', '<', 100)->delete();
DB::table('users')->delete();
DB::table('users')->truncate();
El constructor de consultas también ofrece una forma rápida para "unir" dos consultas en una sola:
$first = DB::table('users')->whereNull('first_name');
$users = DB::table('users')->whereNull('last_name')->union($first)->get();
El método unionAll
está también disponible, y tiene la misma síntaxis que union
.
El constructor de consultas incluye algunas funciones que te ayudan a realizar "bloqueos pesimistas" en tus sentencias SELECT.
Para ejecutar una sentencia SELECT con un "bloqueo compartido", puedes usar el método sharedLock
en la consulta:
DB::table('users')->where('votes', '>', 100)->sharedLock()->get();
Para "bloquear para actualizaciones" en una sentencia SELECT, puedes usar el método lockForUpdate
en la consulta:
DB::table('users')->where('votes', '>', 100)->lockForUpdate()->get();
Puedes fácilmente tener un cache de los resultados de una consulta con el método remember
:
$users = DB::table('users')->remember(10)->get();
En este ejemplo, los resultados de la consulta serán guardados en cache durante diez minutos. Mientras los resultados estén guardados en cache, la consulta no se ejecutará otra vez en la base de datos, y los resultados será cargados del cache predeterminado configurado en tu aplicación.
Si estás usando un controlador de cache soportado, puedes además agregar etiquetas al caché:
$users = DB::table('users')->cacheTags(array('people', 'authors'))->remember(10)->get();