Para desarrollar una aplicación de notas más dinámica, vamos a necesitar obtener los datos desde nuestra base de datos MySQL. En este videotutorial, aprenderás cómo obtener dichos datos de forma muy simple utilizando el constructor de consultas de Laravel a partir de la versión 10.

Descarga el código de NoteSeeder con todas las notas.

¿Qué es el Facade DB?

Laravel incluye un «Service Container» donde se registran todos los servicios del framework. Estos servicios se pueden importar dentro de clases y métodos usando una técnica conocida como «inyección de dependencias», como veremos más adelante. Sin embargo, para facilitar su uso, Laravel también incluye «Facades», los cuales proveen una forma muy fácil y sencilla de acceder a estos servicios como si se trataran de simples métodos estáticos de PHP.

Para utilizar el Facade DB en cualquier clase que tenga espacio de nombres debes importarlo con use Illuminate\Support\Facades\DB.

Un ejemplo de uso del Facade DB es el siguiente: DB::table('notes'). Llamar a este método nos devuelve una instancia de otro objeto: Illuminate\Database\Query\Builder el cual es el constructor de consultas del framework Laravel.

El constructor de consultas nos provee de muchos métodos útiles, como por ejemplo DB::table('notes')->insert([...]) como aprendimos en la lección pasada.

También podemos obtener datos si utilizamos DB::table('notes')->get().

El método get nos devuelve un objeto de la clase Illuminate\Support\Collection. Este objeto incluye muchas funcionalidades que permiten que puedas iterar sobre él, agregar, obtener y contar sus elementos como si se tratase de un arreglo. Así que por los momentos puedes imaginar que Laravel devuelve un simple arreglo y más adelante puedes aprender más sobre las colecciones siguiendo nuestro Curso de Colecciones con Laravel.

Recuerda que puedes aprender cómo crear y trabajar con clases y objetos con nuestro Curso de Programación Orientada a Objetos aquí en Styde.

Personalizando las consultas a la base de datos

Como ya comentamos, DB::table('notes') nos devuelve una instancia del constructor de consultas (Illuminate\Database\Query\Builder), es decir en este punto aún no ha sido ejecutada la consulta. Por lo tanto, antes de llamar al método get, podemos personalizar la consulta a la base de datos de muchas formas a través de este constructor, por ejemplo:

<?php

DB::table('notes')
   ->select(['id', 'title'])
   ->inRandomOrder()
   ->get()
;

Nos permite seleccionar solo los campos id y title de la tabla notes, además obtendremos las notas en orden aleatorio.

Métodos como select, where y inRandomOrder retornan una instancia de Illuminate\Database\Query\Builder, es solo cuando llamas al método get que se realiza la consulta a la base de datos y obtienes un objeto de una clase diferente (Illuminate\Support\Collection).

Obtener un solo registro con el constructor de consultas

El método DB::table()->get siempre nos devolverá una colección de cero, uno o muchos resultados.

En algunos casos vamos a querer obtener un solo registro: por ejemplo, imagina la página para mostrar el detalle de una nota o el perfil de un único usuario. Para esto, podemos llamar al método first:

<?php
use Illuminate\Support\Facades\DB;

$note = DB::table('notes')
    ->where('id', $id)
    ->first()
;

La consulta que construyo tiene 3 pasos:

  1. Primero construimos la consulta con DB::table('notes'). Por supuesto, esto le indica a Laravel que trabaje con la tabla de notas (notes).
  2. Luego, indicamos que solo queremos obtener el resultado o resultados donde el id de la nota coincida con el $id dado.
  3. Finalmente usamos el método first() en vez de get() para obtener un solo registro.

Si intentas obtener un registro que no exista, el método first devolverá NULL.

Debido a que es muy común querer seleccionar un solo registro por su campo id y obtenerlo inmediatamente, Laravel provee un acceso directo a esto utilizando el método find el cual funciona de la misma forma que vimos en el ejemplo anterior:

<?php
use Illuminate\Support\Facades\DB;

$note = DB::table('notes')
    ->find($id)
;

Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.

Lección anterior Insertar datos usando Seeders en Laravel 10 Lección siguiente Desarrollo de rutas y vistas dinámicas con el constructor de consultas en Laravel 10