IronWoods.es

Desarrollo web

Consultas básicas con Laravel / Eloquent

Hay una serie de consultas habituales para obtener datos de una base de datos, por ejemplo, obtener todos los registros de una tabla o uno concreto dada su ID. A continuación, se detallan algunas de estas consultas usando Eloquent.

Ejemplos de consultas con Eloquent


1. Obtener registros de una tabla sin condiciones

Las búsquedas se realizan sin aplicar criterios concretos, es decir que se devolverían todos los registros de la tabla.


2. Obtener registros de una tabla con condiciones

Las búsquedas se realizan aplicando criterios concretos, es decir que se devolverían los registros de la tabla que cumplan las condiciones de la búsqueda.


3. Obtener registros de una tabla con límites, ordenaciones, etc

Hay ciertas operaciones que se usan independientemente del criterio de búsqueda para limitar el número de registros devuelto, ordenarlos, etc.


4. Otras operaciones, como contar registros


5. Notas



1. Obtener registros de una tabla sin condiciones


Obtener todos los registros de una tabla, por ejemplo, "users":

$users = User::all();


// o bien:

$users = User::get();


Obtener todos los registros de una tabla sólo con ciertos campos, por ejemplo, "users" obteniendo solo los campos "name", "gender" y "age":

$users = User::get([

'name',

'gender',

'age',

]);


También podríamos usar el método select() para hacer esta consulta. Es quiza más semántico, pero su principal diferencia es que no necesitamos pasarle un array con los campos, entonces podemos hacerlo así:

$users = User::select([

'name',

'gender',

'age',

])->get();


// o así:

$users = User::select(

'name',

'gender',

'age',

)->get();


Obtener todos los registros de una tabla excluyendo campos concretos, por ejemplo, obtener "users" excluyendo los campos "gender" y "age":

$users = User::all()->makeHidden([

'gender',

'age',

]);


Índice de contenidos



2. Obtener registros de una tabla con condiciones



Obtener un registro con una ID determinada, por ejemplo, el usuario con ID 7:

$user = User::find(7);


Obtener un dato de un registro con una ID determinada, por ejemplo, el email del usuario con ID 7:

$user = User::where('id', 7)->get('email');


// o mejor aún:

$user = User::where('id', 7)->get('email')->first();


¿Por qué es mejor la última consulta?

Como resultado devuelve el objeto y no una colección con el objeto.


Algo más sencillo, para obtener el objeto:

$user = User::where('id', 7)->first(['email']);


Y más sencillo todavía:

$user = User::find(7, ['email']);


Para obtener varios registros conociendo sus identificadores, por ejemplo, los usuarios con identificadores 7, 8 y 12:

$user = User::find([7, 8, 12]);


Obtener registros con un valor determinado, por ejemplo, los usuarios con edad 18 años:

$users = User::where('age', 18)

->get();


Obtener el primer registro con un valor determinado, por ejemplo, el primer usuario con edad 18 años:

$user = User::where('age', 18)

->first();


Obtener el último registro con un valor determinado, por ejemplo, el último usuario con edad 18 años:

$user = User::where('age', 18)

->orderBy('id', 'DESC')

->first();


NOTA: Suponiendo que el identificador de la tabla sea 'id' y que este sea autoincremental. Otra posibilidad sería usar el campo 'created_at' en lugar de 'id'.


Obtener registros con un valor mayor a uno determinado, por ejemplo, los usuarios de más 18 años:

$users = User::where('age', '>', 18)

->get();


O de acuerdo a un intervalo, por ejemplo, los usuarios de entre 18 y 45 años:

$users = User::where('age', '>=', 18)

->where('age', '<=', 45)

->get();


Esta última consulta equivale a una consulta con WHERE ... AND ..., es decir que genera la consulta SQL:

SELECT * FROM `users` WHERE `age` >= 18 AND `age` <= 45


Para usar la condición OR se usa orWhere():

$users = User::where('age', '>', 18)

->orWhere('profession', 'barman')

->get();


Que se traduce en la siguiente consulta:

SELECT * FROM `users` WHERE `age` >= 18 OR `profession` = 'barman'


Índice de contenidos



3. Obtener registros de una tabla con límites, ordenaciones, etc


Limitar el número de registros que devuelve una consulta, por ejemplo, obtener solo los 25 primeros usuarios:

$users = User::take(25)->get();


Limitar el número de registros que devuelve una consulta saltando un número de registros, por ejemplo, obtener 5 usuarios, saltándose el primero:

$users = User::skip(1)->take(5)->get();


Índice de contenidos



4. Otras operaciones


Contar los registros de una tabla, por ejemplo, el número de usuarios:

$users_number = User::count();


Esto da el mismo resultado que:

$users_number = User::all()->count();


// o que:

$users_number = User::get()->count();


Si bien en el primer caso es el SGBD quien cuenta los registros, mientras que en los alternativos se cuentan despues de obtenerlos (menos óptimo).


En caso de que se vayan a utilizar los datos de la tabla:

$users = User::all();

$users_number = $users->count();


Es decir, obtenemos la colección de objetos y, seguidamente, los contamos para evitar realizar dos consultas a la BD.


Índice de contenidos



Notas:


Los métodos all() y get() al final de una consulta devuelven una colección de objetos Eloquent, aunque sólo haya un resultado, si se usa por ejemplo first() se obtiene un sólo objeto. Esto es importante a la hora de acceder a los datos. Por ejemplo, si esperamos un objeto, podríamos tener como resultado null, si solicitamos una colección y no hay resultados, tendremos una colección vacía pero no null.


Es muy habitual usar métodos para trabajar con colecciones Eloquent, algunos son comunes a los de colecciones no Eloquent, de echo las colecciones Eloquent extienden a las colecciones, y hay que saber cuando usar cada tipo.


Índice de contenidos

Enlaces de interés:

Documentación de Laravel / Eloquent

Código de la clase Builder de Eloquent

Métodos para trabajar con colecciones Eloquent

Métodos para trabajar con colecciones

Dos tipos de colecciones en Laravel (en inglés)


30-08-2019 (Actualizado 06-09-2019)

Entradas relacionadas:

Sitio libre de scripts. Solo efectos HTML / CSS