Skip to content

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
<?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

php
// 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:

sh
php artisan make:model Contact

Esto es lo que obtendremos en app/Models/Contact.php:

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:

sh
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:

php
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:

php
protected $primaryKey = 'contact_id';

Y si quieres configurarlo para que no se incremente, utiliza:

php
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:

php
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:

php
protected $dateFormat = 'U';

Retrieving Data with Eloquent