Eloquent ORM

ORM

Es un marco de trabajo o libreria que nos provee comunicacion entre una base de datos y un lenguaje de programacion.

Model

Los modelos es una capa dentro de las estructura MVC el cual basicamente manejan toda clases de computación y consultas SQL. En teoria los modelos estan basado en tres tipos de estructuras:

  • Modelo de dominio (Domain objects) - Del modelos de domino surgen las clases con la cual programas las tablas de la base de dato y cuales son las clases u objetos que vas a utilizar en tu sistema. En teoria dominio es lo que vas a resolver o de lo que se trata. Es el contexto del problema el cual disenamos una solucion al cual llamamos dominio. Seria el negocio( problemas que vas a resolver), reglas, procesos, sistemas, como opera la compania el cual puedes descomponer en sub dominios como area de contable, area recursos humano, proveedores de mercadeo, realizar pagos, compras, etc. modelo es como vas a plantear la solucion, el diseno y implementacion de algun algoritmo a solucionar problema. Especificacion formal de una funcion, estructura, comportamiento.
  • Mapeo de datos (Data mappers) - Es responsable de mover o transferir data entre un objeto (memory data representation/ domain layer) y una base de dato, mientras a la misma vez mantiene independencia entre ambas cosas.
  • Servicios - Responsable de la comunicacion entre modelo de dominio y mapeos de datos.

Generar un modelo

Los modelos los podemos generar desde la consola utilizando el comando make:model de Artisan

php artisan make:model Profession

Los nombres de los modelos deben ser con letras mayuscula y si queremos agregar dos palabras en el nombre en cada palabra debe iniciar con letras mayuscula todas junta.

php artisan make:model ProfessionCategory

Por defecto este archivo .php sera generado en el directorio app de nuestra aplicacion, en el caso que queramos generarlo en algun directorio especifico debemos especificarlo de la siguiente forma:

php artisan make:model Models/Profession

Especificar tabla relacionada al modelo

Si utilizamos como nombre de modelo Profession Laravel hara la consulta a la tabla la cual su nombre es correspondiente professions , si utilizamos User Laravel hara consulta a la tabla users . En el caso que tengamos una tabla que no sea igual al nombre de modelo, debemos especificarlo en el modelo definiendo la propiedad $table

class Profession extends Model
{
    protected $table = 'my_professions';
}

Insertar datos utilizando modelo

Para insertar datos debemos hacerlo utilizando el metodo create del modelo

<?php
// ...
use App\Profession;
// ...

// ...
Profession::create([
    'title' => 'Backend developer'
]);
// ...

Realizar consulta

Podemos utilizar los modelos para hacer consulta a la base de dato utilizando el metodo all() obtenemos todo el contenido de la tabla.

$professions = Profession::all();

Podemos retornar un resultado dependiendo de su id mediante el metodo find()

$profession = Profession::find(1);

Declarar metodos en el modelo

Podemos declarar metodos dentro de un modelo y utilizarlos cuando interactuamos con los objetos de estos modelos.

Metodo no estatico

Asociamos un metodo para ser utilizado sobre un objeto

public function isAdmin()
{
    return $this->email === '[email protected]';
}

En este caso isAdmin() devuelve un valor booleano, ejemplo del uso:

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

Metodo estatico

Asociamos un metodo a la clase de modelo como tal cual representa el acceso a una tabla de la base de datos. Estos metodos son usados tipicamente para consulta.

public static function findByEmail($email)
{
    return static::where('email', $email)->first();
}

MassAssignmentException

Es una proteccion el cual nos ofrece Laravel para evitar la inyeccion de datos a atributos no deseados. Esta ocurre cuando un usuario envia un parametro inesperado mediante una solicitud y dicha parametro realiza cambio en la base de datos. Esta proteccion la podemos resolver de la siguiente manera.

$fillable

Para evitar esto dentro del modelo agregamos la propiedad $fillable y asignamos como valores de array con las columna que queremos permitir que pueda ser cargadas de forma masiva.

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

$guarded

Esta propiedad tendra como valor un array, pero en este caso las columna que indicamos son las que no queremos que puedan ser cargadas de forma masiva.

class User extends Model
{
    protected $guarded = ['is_admin'];
}

Asignar un campo no fillable

Para asignar un valor que no esta dentro de $fillable , podemos asignar una nueva instancia de un modelo en una variable y luego asignar el campo de forma manual

$user = new User(['name' => 'Duilio', 'password' => bcrypt('123')]);

$user->is_admin = true;

$user->save();

Nota que new User($datos) solo crea un nuevo modelo sin persistir en la base de datos a diferencia de User::create($datos) que crea un nuevo modelo y lo inserta en la base de datos en un solo paso.

results matching ""

    No results matching ""