Modelos en Laravel
Los modelos los puede ver algo un poco diferentes en laravel, debido a que hay muchos ejemplos en que se hacen consultas en los controladores(ver controladores en larvel), si las consultas son simples esta bastante bien hacerlas aquí.
No tiene nada de malo tenerla en el controlador o en el Modelo o en otro lugar solo vea lo que más le conviene solo no las pongan en las vistas.
Aquí veremos la parte esencial de la que se encarga el Model en Laravel.
Los modelos son para interactuar con nuestra base de datos de esta manera podemos hacer cualquier clase de consulta a nuestra base de datos por ejemplo: insertar, borrar, modificar, mostrar.
Creando un Modelo(Model)
Para crear un modelo es muy simple en Laravel, lo puede hacer manualmente, pero también puede usar la consola y escribir algo con la siguiente sintaxis.
carpeta del proyectophp artisan make:model <nombre-del-modelo>
Un ejemplo:
carpeta del proyectophp artisan make:model vehiculo
Ademas de esto podemos pedirle que cree una migración(ver migraciones en laravel) para nuestro modelo, la sintaxis seria la siguiente:
carpeta del proyectophp artisan make:model <nombre-del-modelo> [--migration|-m]
si no esta entendiendo la sintaxis en<> y [] es que es opcional y| quiere decir que es este valor o el otro. Así pues si seguimos con el ejemplo de vehículo podríamos escribirlo de las 2 siguientes maneras
carpeta del proyectophp artisan make:model Vehiculo --migration
o
carpeta del proyectophp artisan make:model Vehiculo -m
Bueno basta de introducciones y creemos el modelo y la migración también veamos que hace esto. Por convención escriba el nombre del modelo en mayúsculas, ya que creara una clase.
Corre en tu proyecto:
php artisan make:model Vehiculo -m
como puede ver aqui crea el model(Model) y la migración para este la cual se llama 2019_04_140609_create_vehiculos_table.
La migración no la vamos a ver veamos el modelo. Lo puede encontrar en app>Vehiculo.php en este caso.
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Vehiculo extends Model { // }
Atributos
Ahora usted se preguntará como sabe con qué tabla en la base de datos se relaciona el Modelo si no tiene nada escrito pues bien el modelo asume que la tabla de la base de datos tiene su nombre en plural. En este caso vehículos.
En español y otros lenguajes que no sean en ingles esto puede complicarnos un poco. Por eso también se pensó en que la base de datos podría tener otro nombre en vez del plural.
Haré el ejemplo un tanto grosero de como hacer esto. Supongamos que queremos que el modelo sea para la tabla vehiculo_automotor.
Para eso tenemos que agregar la siguiente tabla dentro de la clase vehiculo_automotor.
app/Vehiculo.phpprotected $table = 'vehiculos_automotor';
Laravel chequea si existe esta variable y si no existe usa el plural(vehiculos). Veamos como quedaría este modelo.
app/Vehiculo.php<?php namespace App; use Illuminate\Database\Eloquent\Model; class Vehiculo extends Model { protected $table = 'vehiculos_automotor'; }
El atributo Timestamps
Si nuestra tabla en la base de datos no tiene timestamps podemos declarar el timestamp como false en nuestro modelo (estos son create_at y update_at y son creados en la migración).
case Timestamps does not exist in tablepublic $timestamps = false;
Atributos Predefinidos
También le podemos definir atributos por defectos por ejemplo las luces de mi vehículo.
atributos por defectoprotected $attributes = [ 'luces' => "Luces diurnas con LEDS ", ];
Evitar vulnerabilidades por Mass Assigment (asignación masiva)
Para evitar que su aplicación tenga una vulnerabilidad de tipo mass assignment. Debe especificar los campos que se pueden tener mass assignment o asignación masiva.
Con fillable puede especificar que campos pueden tener asignación masiva y con guarded hace lo opuesto.
Si usa fillable no use guarded, fillable especifica que campos van a poder ser asignarse masivamente, el resto los toma como no asignables.
En cambio guarded hace lo contrario a fillable. Úselos según le convenga o el que este mas acostumbrado.
mass assignment is allowed on name attributeprotected $fillable = ['name'];// estoy haciendo mass assigment estos atributos
con guarded:
mass asignment is not allowed on nameprotected $guarded = ['name'];// no estoy haciendo mass assigment estos atributos
Como acceder a nuestro Modelo
A nuestro modelo podemos acceder tanto de la ruta como desde el controlador usando la siguiente sintaxis.
getting dataApp\<model>::<algun comando del eloquent>
Veamos un ejemplo en una ruta(ver rutas en laravel). Recuerda los closures?
routes/web.phpRoute::get("vehiculos/show",function(){ $vehiculos = App\Vehiculo::all(); foreach ($vehiculos as $vehiculo) { echo $vehiculo->modelo."<br/>"; } });
Esto nos dará la siguiente lista.
renault clio 1.4
ford fiesta
Volkswagen Amarok 2.0
Chery Tiggo 2.0 Luxury
En los controladores puede declarar que usara model después del namespace usando la palabra clave use.
usar un modelo dentro del controladoruse <nombre_modelo>
Ejemplo con un controlador para vehículo.
app/Http/Controllers/VehiculoController.php<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Vehiculo; class VehiculoController extends Controller { public function show(){ $vehiculos = Vehiculo:: all(); foreach($vehiculos as $vehiculo){ echo $vehiculo->modelo."<br/>"; } } }
Referencia https://laravel.com/docs/5.8/eloquent#introduction