Introducción a Eloquent
Ahora que hemos cubierto el generador de consultas, hablemos de Eloquent, la herramienta de base de datos insignia de Laravel que se basa en el generador de consultas.
Eloquent es un ORM de ActiveRecord, lo que significa que es una capa de abstracción de base de datos que proporciona una única interfaz para interactuar con múltiples tipos de bases de datos. “ActiveRecord” significa que una única clase de Eloquent es responsable no solo de proporcionar la capacidad de interactuar con la tabla en su totalidad (por ejemplo, User::all()
obtiene todos los usuarios), sino también de representar una fila de tabla individual (por ejemplo, $sharon = new User
). Además, cada instancia es capaz de administrar su propia persistencia; puede llamar a $sharon->save()
o $sharon->delete()
.
Eloquent se centra principalmente en la simplicidad y, al igual que el resto del framework, se basa en la “convención sobre la configuración” para permitirle construir modelos potentes con un código mínimo.
Por ejemplo, con el modelo definido en el ejemplo siguiente:
El modelo Eloquent más simple
<?php
use Illuminate\Database\Eloquent\Model;
class Contact extends Model {}
Puede realizar todas las operaciones del ejemplo siguiente:
Operaciones alcanzables con el modelo Eloquent más simple
// In a controller
public function save(Request $request)
{
// Create and save a new contact from user input
$contact = new Contact();
$contact->first_name = $request->input('first_name');
$contact->last_name = $request->input('last_name');
$contact->email = $request->input('email');
$contact->save();
return redirect('contacts');
}
public function show($contactId)
{
// Return a JSON representation of a contact based on a URL segment;
// if the contact doesn't exist, throw an exception
return Contact::findOrFail($contactId);
}
public function vips()
{
// Unnecessarily complex example, but still possible with basic Eloquent
// class; adds a "formalName" property to every VIP entry
return Contact::where('vip', true)->get()->map(function ($contact) {
$contact->formalName = "The exalted {$contact->first_name} of the
{$contact->last_name}s";
return $contact;
});
}
¿Cómo? Por convención. Eloquent asume el nombre de la tabla (Contact
se convierte en contacts
) y, con eso, tienes un modelo Eloquent completamente funcional.
Veamos cómo trabajamos con los modelos Eloquent.
Creando y Definiendo Modelos Elocuentes
Primero, vamos a crear un modelo. Hay un comando Artisan para eso:
php artisan make:model Contact
Esto es lo que obtendremos en app/Models/Contact.php
:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Contact extends Model
{
//
}
Creando una Migración Junto con Su Modelo
Si desea crear automáticamente una migración cuando crea su modelo, pase el indicador -m
o --migration
:
php artisan make:model Contact --migration
Nombre de la tabla
El comportamiento predeterminado para los nombres de tabla es que Laravel convierte en "snake cases" y pluraliza el nombre de la clase, por lo que SecondaryContact
accedería a una tabla llamada secondary_contacts
. Si desea personalizar el nombre, configure la propiedad $table
explícitamente en el modelo:
protected $table = 'contacts_secondary';
Clave primaria
Laravel asume, por defecto, que cada tabla tendrá una clave primaria de número entero que se incrementa automáticamente y se llamará id
.
Si quieres cambiar el nombre de tu clave primaria, cambia la propiedad $primaryKey
:
protected $primaryKey = 'contact_id';
Y si quieres configurarlo para que no se incremente, utiliza:
public $incrementing = false;
Impresión de un Resumen de un Modelo Elocuente
A medida que su proyecto crece, puede resultar un poco complicado realizar un seguimiento de la definición, los atributos y las relaciones de cada modelo. El comando
model:show
puede ayudarle con esto al ofrecerle un resumen de su modelo e imprimir los nombres de las bases de datos y las tablas. También enumera los atributos junto con los modificadores de columna SQL, el tipo y el tamaño; enumera los mutadores junto con los atributos; enumera todas las relaciones del modelo; y enumera los observadores del modelo.
Marcas de tiempo
Eloquent espera que cada tabla tenga las columnas de marca de tiempo created_at
y updated_at
. Si su tabla no las necesita, deshabilite la funcionalidad $timestamps
:
public $timestamps = false;
Puede personalizar el formato que utiliza Eloquent para almacenar sus marcas de tiempo en la base de datos configurando la propiedad de clase $dateFormat
en una cadena personalizada. La cadena se analizará utilizando la sintaxis date()
de PHP, por lo que el siguiente ejemplo almacenará la fecha como segundos desde la época de Unix:
protected $dateFormat = 'U';