Laravel 6 Full 8

Elocuent ORM

Primero que es ORM. Mapeo Objeto-Relacional o como se conocen comúnmente, ORM (del inglés Object Relational Mapping).

Un ORM te permite convertir los datos de tus objectos en un formato correcto para poder guardar la información en una base de datos (mapeo) creándose una base de datos virtual donde los datos que se encuentran en nuestra aplicación, quedan vinculados a la base de datos (persistencia).

Si alguna vez has programado alguna aplicación que se conecta a una base de datos, habrás podido comprobar lo laborioso que es transformar toda la información que recibes de la base datos, principalmente en tablas, en los objetos de tu aplicación y viceversa. A ésto se le denomina mapeo. Utilizando un ORM este mapeo será automático, es más, será independiente de la base de datos que estés utilizando en ese momento pudiendo cambiar de motor de base de datos según tus necesidades.

En definitiva es un patrón de diseño creado con el objetivo de usar objetos para la representación de los datos y sus relaciones(relaciones entre tablas) en una base de datos relacional

El ORM Eloquent incluido con Laravel proporciona una genial y simple implentación básica de ActiveRecord para trabajar con tu base de datos. Cada tabla de base de datos tiene un correspondiente «Modelo» el cual es usado para interactuar con la tabla. Los modelos permiten que consultes los datos en tus tablas, así como también insertar nuevos registros dentro de la tabla.

Definiendo Modelos

El uso de el orm de laravel comienza desde la creación de nuestro modelo, se que en ningun lado lo dice tan directo en la documentación oficial pero es de esta manera. Sin un modelo laravel no va a poder usar Eloquent.

Para utilizar eloquent primero deberá crearse un modelo, los modelos son la forma mas fácil de relacionarnos con nuestra base de datos, ( vea modelos en laravel). Por defecto Laravel creo un model de user por lo que lo borro y creo uno nuevo con el comando:

php artisan make:model User

Esto ya crea el modelo para User, ahora debemos cambiar la clase UserController para realizar la consulta con Eloquent.

//$users = DB::table('users')->where('name_user', $name)->first();

Ahora la consulta queda así respecto a la anterior de arriba.

$users = User::where('name_user', $name)->first();

MUY IMPORTANTE: Hay que importar el modelo que se use, en esta caso User. Tambien eliminaremos la condición si no existe usuario y usuaremos firstOrFail() en vez de first().

use App\User;

Ejemplo Eloquent ORM:

Documentación https://documentacion-laravel.com/eloquent.html#definiendo-modelos

Ahora, vamos a mirar un modelo Flight de ejemplo, el cual usaremos para obtener y guardar información desde nuestra tabla de base de datos flights:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Flight extends Model
{
    //
}

Nombres de tabla

Observa que no le dijimos a Eloquent cuál tabla usar para nuestro modelo Flight. Por convención, el nombre de la clase en plural y en formato «snake_case» será usado como el nombre de tabla a menos que otro nombre sea especificado expresamente. Así, en este caso, Eloquent asumirá que el modelo Flight guarde los registros en la tabla flights. Puedes especificar una tabla personalizada al definir una propiedad table en tu modelo:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

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

Claves primarias

Eloquent asumirá que cada tabla tiene una columna de clave primaria denominada id. Puedes definir una propiedad $primaryKey protegida para sobrescribir esta convención:

<?php

namespace App;
use Illuminate\Database\Eloquent\Model;

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

Marcas de tiempo o timestamps

De forma predeterminada, Eloquent espera que las columnas created_at y updated_at existan en tus tablas. Si no deseas tener estas columnas manejadas automáticamente por Eloquent, establece la propiedad $timestamps de tu modelo a false:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Flight extends Model
{
    /**
    * Indicates if the model should be timestamped.
    *
    * @var bool
    */
    public $timestamps = false;
}

Conexión de base de datos

Valores de atributo predeterminados

Si deseas definir los valores predeterminados para algunos de los atributos de su modelo, puedes definir una propiedad $attributes en tu modelo:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Flight extends Model
{
    /**
    * The model's default values for attributes.
    *
    * @var array
    */
    protected $attributes = [
        'delayed' => false,
    ];
}

Obteniendo modelos

Una vez que has creado un modelo y su tabla de base de datos asociada, estás listo para empezar a obtener datos de tu base de datos. Piensa en cada modelo de Eloquent como un constructor de consultas muy poderoso que te permite consultar fluidamente la tabla de base de datos asociada con el modelo. Por ejemplo:

<?php

$flights = App\Flight::all();

foreach ($flights as $flight) {
    echo $flight->name;
}
Añadiendo restricciones adicionales

El método all de Eloquent devolverá todos los resultados en la tabla del modelo. Ya que cada modelo de Eloquent sirve como un constructor de consultas, también puedes añadir restricciones a las consultas y entonces usar el método get para obtener los resultados:

$flights = App\Flight::where('active', 1)
                ->orderBy('name', 'desc')
                ->take(10)
                ->get();

Actualizando modelos

Colecciones

Resultados divididos en partes (chunk)

Usando cursores

Obteniendo modelos individuales / Agrupamientos

Obteniendo agrupamientos

Insertando Y actualizando modelos

Para agregar un nuevo registro en la base de datos crea una nueva instancia de modelo, establece los atributos del modelo y después ejecuta el método save:

<?php

namespace App\Http\Controllers;

use App\Flight;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class FlightController extends Controller
{
    /**
    * Create a new flight instance.
    *
    * @param  Request  $request
    * @return Response
    */
    public function store(Request $request)
    {
        // Validate the request...

        $flight = new Flight;

        $flight->name = $request->name;

        $flight->save();
    }
}

En este ejemplo, asignamos el parámetro name de la solicitud entrante al atributo name de la instancia del modelo App\Flight. Cuando ejecutamos el método save, un registro será insertado en la base de datos. Las marcas de tiempo created_at y updated_at serán automáticamente establecidas cuando el método save sea ejecutado, no hay necesidad de establecerlos manualmente.

Actualizaciones

El método save también puede ser usado para actualizar modelos que ya existen en la base de datos. Para actualizar un modelo, debes obtenerlo, establecer cualquiera de los atributos que desees actualizar y después ejecutar el método save. Otra vez, la marca de tiempo updated_at será actualizada automáticamente, no hay necesidad de establecer su valor manualmente.

$flight = App\Flight::find(1);

$flight->name = 'New Flight Name';

$flight->save();

Asignación masiva

También puedes usar el método create para guardar un nuevo modelo en una sola línea. La instancia de modelo insertada te será devuelta por el método. Sin embargo, antes de hacer eso, necesitarás especificar o un atributo fillable o guarded del modelo, de modo que todos los modelos de Eloquent se protejan contra la asignación masiva de forma predeterminada.

Una vulnerabilidad en la asignación masiva ocurre cuando un usuario pasa un parámetro HTTP inesperado a través de una solicitud y ese parámetro cambia una columna en tu base de datos que no esperabas. Por ejemplo, un usuario malicioso podría enviar un parámetro is_admin a través de una solicitud HTTP, la cual es entonces pasada en el método create de tu modelo, permitiendo que el usuario se promueva a si mismo como un usuario administrador.

Así que, para empezar, debes definir cuáles atributos del modelo quieres que se asignen de forma masiva. Puedes hacerlo usando la propiedad $fillable del modelo. Por ejemplo, vamos a hacer el atributo name de nuestro modelo Flight sea asignado masivamente.

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Flight extends Model
{
    /**
    * The attributes that are mass assignable.
    *
    * @var array
    */
    protected $fillable = ['name'];
}

Una vez que hemos indicado los atributos asignables en masa, podemos usar el método create para insertar un nuevo registro en la base de datos. El método create devuelve la instancia de modelo guardada:

$flight = App\Flight::create(['name' => 'Flight 10']);

Si ya tienes una instancia del modelo, puedes usar el método fill para llenarla con un arreglo de atributos:

$flight->fill(['name' => 'Flight 22']);

Protección de atributos

Otros Métodos De Creación

Eliminando modelos

Bueno en este punto es mejor consultar la documentación que seguir, o sea que paso al siguiente capitulo.

Próximo Capítulo: Laravel 6 Full 9