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.