Volver a la página principal
domingo 7 julio 2024
4

Cómo utilizar Laravel Eloquent

Introducción a Eloquent

Eloquent es el ORM de Laravel que facilita la interacción con bases de datos utilizando un enfoque orientado a objetos. Cada tabla de la base de datos tiene un "Modelo" correspondiente que permite interactuar con esa tabla.

Configuración

Para comenzar a usar Eloquent, primero necesitas configurar tu conexión a la base de datos en el archivo config/database.php. Laravel soporta varias bases de datos, incluyendo MySQL, PostgreSQL, SQLite, y SQL Server.

// config/database.php

'mysql' => [
    'driver' => 'mysql',
    'host' => env('DB_HOST', '127.0.0.1'),
    'port' => env('DB_PORT', '3306'),
    'database' => env('DB_DATABASE', 'forge'),
    'username' => env('DB_USERNAME', 'forge'),
    'password' => env('DB_PASSWORD', ''),
    'unix_socket' => env('DB_SOCKET', ''),
    'charset' => 'utf8mb4',
    'collation' => 'utf8mb4_unicode_ci',
    'prefix' => '',
    'strict' => true,
    'engine' => null,
],

Definiendo Modelos

Un modelo en Eloquent representa una tabla en tu base de datos. Los modelos se definen en el directorio app/Models.

// app/Models/User.php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    use HasFactory;

    // Si la tabla no sigue las convenciones de nombres de Laravel, puedes especificar el nombre de la tabla:
    // protected $table = 'my_users';

    // Si la tabla no tiene las columnas created_at y updated_at
    // public $timestamps = false;
}

Consultas Básicas

Obtener todos los registros

$users = User::all();

Obtener un solo registro

$user = User::find(1);

Condiciones

$users = User::where('active', 1)->get();

Ordenar resultados

$users = User::orderBy('name', 'asc')->get();

Inserción de Datos

$user = new User;
$user->name = 'John Doe';
$user->email = 'john@example.com';
$user->save();

Creación Masiva

User::create([
    'name' => 'Jane Doe',
    'email' => 'jane@example.com',
]);

Nota: Asegúrate de que los campos estén listados en la propiedad $fillable del modelo para permitir la asignación masiva.

class User extends Model
{
    protected $fillable = ['name', 'email'];
}

Actualización de Datos

Actualizar un registro

$user = User::find(1);
$user->name = 'John Smith';
$user->save();

Actualización Masiva

User::where('active', 1)->update(['active' => 0]);

Eliminación de Datos

Eliminar un registro

$user = User::find(1);
$user->delete();

Eliminación Masiva

User::destroy([1, 2, 3]);

Relaciones

Uno a Uno

class User extends Model
{
    public function phone()
    {
        return $this->hasOne(Phone::class);
    }
}

class Phone extends Model
{
    public function user()
    {
        return $this->belongsTo(User::class);
    }
}

Uno a Muchos

class Post extends Model
{
    public function comments()
    {
        return $this->hasMany(Comment::class);
    }
}

class Comment extends Model
{
    public function post()
    {
        return $this->belongsTo(Post::class);
    }
}

Muchos a Muchos

class User extends Model
{
    public function roles()
    {
        return $this->belongsToMany(Role::class);
    }
}

class Role extends Model
{
    public function users()
    {
        return $this->belongsToMany(User::class);
    }
}

Relaciones Polimórficas

class Photo extends Model
{
    public function imageable()
    {
        return $this->morphTo();
    }
}

class Post extends Model
{
    public function photos()
    {
        return $this->morphMany(Photo::class, 'imageable');
    }
}

class User extends Model
{
    public function photos()
    {
        return $this->morphMany(Photo::class, 'imageable');
    }
}

Accesores y Mutadores

Accesores

class User extends Model
{
    public function getFullNameAttribute()
    {
        return "{$this->first_name} {$this->last_name}";
    }
}

Mutadores

class User extends Model
{
    public function setPasswordAttribute($value)
    {
        $this->attributes['password'] = bcrypt($value);
    }
}

Eager Loading

$users = User::with('posts')->get();

Scopes Globales y Locales

Scope Local

class User extends Model
{
    public function scopeActive($query)
    {
        return $query->where('active', 1);
    }
}
$activeUsers = User::active()->get();

Scope Global

class User extends Model
{
    protected static function booted()
    {
        static::addGlobalScope('active', function (Builder $builder) {
            $builder->where('active', 1);
        });
    }
}

Eventos

Eloquent proporciona varios eventos como creating, created, updating, updated, deleting, deleted, entre otros.

class User extends Model
{
    protected static function booted()
    {
        static::creating(function ($user) {
            // Lógica antes de crear un usuario
        });

        static::created(function ($user) {
            // Lógica después de crear un usuario
        });
    }
}

Serialización

Puedes convertir modelos y colecciones de Eloquent a JSON usando el método toJson.

return User::all()->toJson();

Consultas Avanzadas

Paginación

$users = User::paginate(15);

Chunking

User::chunk(100, function ($users) {
    foreach ($users as $user) {
        // Lógica para cada usuario
    }
});

Conclusión

Laravel Eloquent es una herramienta poderosa para interactuar con bases de datos de una manera intuitiva y eficiente. Esta guía ha cubierto los conceptos básicos y avanzados, permitiéndote utilizar Eloquent para la mayoría de las tareas de manipulación de datos en tus aplicaciones Laravel. Con práctica y exploración, podrás aprovechar al máximo todas las características que Eloquent ofrece.

Compartir:
Creado por:
Author photo

Jorge García

Fullstack developer