Qué es Eloquent en laravel ?

2019-07-13 Laravel
Tags   Laravel 5.8

Eloquent es el ORM de laravel que implementa el patrón de arquitectura Active Record. Eso significa que cada tabla en la base de datos corresponde a una clase PHP (modelo) que interactúa con ella. Cada instancia de dicha clase corresponde a un registro en la tabla y genera persistencia en la base de datos, con lo cual una actualización de los atributos de la clase puede alterar el registro correspondiente en la base de datos.

Active Record

Para que quede un poco más clara la implementación del Active Record creemos la siguiente tabla mediante una migración.

php artisan make:migration create_empleados_table

Si aún no sabes qué es un migración te recomendamos leer nuestro post Migraciones de base de datos en laravel. Definamos pues la estructura de la tabla empleados en el modelo CreateEmpleadosTable.

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateEmpleadosTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('empleados', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('documento');
            $table->string('nombre');
            $table->string('apellidos');
            $table->integer('edad');
            $table->decimal('salario', 8, 2);
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('empleados');
    }
}

Ejecutemos la migración, creemos el modelo e ingresemos al tinker de laravel. Tinker, es una shell interactiva que viene incluída como dependencia en la instalación de laravel, en la cual podemos ejecutar comandos de PHP e interactuar de manera muy sencilla con las clases, modelos y demás elementos de nuestra aplicación.

php artisan migrate
php artisan make:model Empleado
php artisan tinker

Hagamos uso del nuevo modelo que acabamos de generar y creemos un registro en la base de datos. Nota que para cada comando ejecutado en la consola el tinker devuelve el valor de la expresión.

Psy Shell v0.9.9 (PHP 7.2.5 — cli) by Justin Hileman
>>> $empleado = new \App\Empleado;
=> App\Empleado {#2960}
>>> $empleado->id = 1;
=> 1
>>> $empleado->documento = '1110355987';
=> "1110355987"
>>> $empleado->nombre = 'John';
=> "John"
>>> $empleado->apellidos = 'Doe';
=> "Doe"
>>> $empleado->edad = 25;
=> 25
>>> $empleado->salario = 2300;
=> 2300
>>> $empleado->save();
=> 2300

El último método utilizado (save) realiza la persistencia en la base de datos guardando el registro. Para verificar que en efecto ha quedado guardado podemos utilizar el método find de eloquent de la siguiente manera:

>>> (new \App\Empleado)->find(1)
=> App\Empleado {#2965
     id: 1,
     documento: "1110355987",
     nombre: "John",
     apellidos: "Doe",
     edad: 25,
     salario: "2300.00",
     created_at: "2019-07-13 05:00:57",
     updated_at: "2019-07-13 05:00:57",
   }

Este método realizará la búsqueda del registro directamente en la base de datos por su llave primaria. Si eres eres tan curioso como yo y te has preguntada cómo le ha hecho laravel para realizar un bind de nuestro modelo y la tabla en la base de datos, esto sucede porque laravel utiliza por regla general nombres singulares para los modelos y asume nombres en plural para las tablas en la base de datos. Es decir, nuestro modelo Empleado se realaciona con la tabla Empleados. En el ejemplo anterior hemos creado el modelo por aparte, pero existe un comando en laravel que crea una migración y su modelo asociado todo en un solo paso, de esta manera nos ahorramos utilizar make:migration y tenemos el siguiente comando equivalente.

php artisan make:model Empleado --migration

O bien,

php artisan make:model Empleado -m

Si hubieras ejecutado este comando hubieras visto que crea el modelo con su nombre en singular y la migración con el nombre en plural. Así como esta, hay muchas otras convenciones que utiliza Eloquent para hacernos las cosas un poco más fáciles, veamos pues algunas de ellas.

Convenciones de modelos

( 1 ) El comando make:model crea un archivo con el nombre del modelo en la carpeta app. Todos los modelos extienden de la clase Illuminate\Database\Eloquent\Model. Si observar el archivo App/Empleado.php creado más arriba lucirá de la siguiente manera.

namespace App;

use Illuminate\Database\Eloquent\Model;

class Empleado extends Model
{
    //
}

( 2 ) Si creas un modelo con nombre en singular, de manera predeterminada Eloquent asumirá que está relacionado con una tabla con su mismo nombre en plural. Para cambiar este comportamiento basta con especificar directamente en la clase modelo el nombre de la tabla.

namespace App;

use Illuminate\Database\Eloquent\Model;

class Empleado extends Model
{
    /**
     * The table associated with the model.
     *
     * @var string
     */
    protected $table = 'erp_empleados';
}

( 3 ) Eloquent asume que el nombre de la llave primaria de una tabla es siempre id y que es un entero incremental. Una vez más para cambiar este comportamiento basta entrar al código del modelo y hacer los cambios respectivos.

namespace App;

use Illuminate\Database\Eloquent\Model;

class Empleado extends Model
{
    /**
     * The primary key associated with the table.
     *
     * @var string
     */
    protected $primaryKey = 'empleado_id';

    /**
     * Indicates if the IDs are auto-incrementing.
     *
     * @var bool
     */
    public $incrementing = false;

    /**
     * The "type" of the auto-incrementing ID.
     *
     * @var string
     */
    protected $keyType = 'string';
}

Utiliza el $keyType solamente si el tipo de datos de la columna de llave primaria no es un entero.

( 4 ) Eloquent utiliza por defecto snake case para el nombre de las tablas. Lo cuál significa que nombres compuestos serán separados por el caractér _ (underscore).

Ahora que ya sabes qué es Eloquent en laravel y has visto de manera somera cómo funciona, estás listo para realizar operaciones CRUD en la base de datos. En nuestro próximo post veremos cómo interactuar con la base de datos para realizar las operaciones básicas sobre ella. Hasta la próxima.

Acerca de Darío Rivera

Author

Ingeniero de desarrollo en PlacetoPay , Medellín. Darío ha trabajado por más de 6 años en lenguajes de programación web especialmente en PHP. Creador del microframework DronePHP basado en Zend y Laravel.

Sólo aquellos que han alcanzado el éxito saben que siempre estuvo a un paso del momento en que pensaron renunciar.