Blog de programación, errores, soluciones

Laravel / Model – entendiendo los 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 mas 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.

php artisan make:model <nombre-del-modelo>

Un ejemplo:

php 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:

php 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

php artisan make:model Vehiculo --migration

o

php 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.

git bash – 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.

[info] – Los modelos son creados dentro de la carpeta app pero también puede cambiar la carpeta donde se crean(no es recomendad, tenga en cuenta que otro programador podría tomar el programa luego) en composer.json.

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Vehiculo extends Model
{
    //
}

Ahora usted se preguntara como sabe con que 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 de el plural.

Hare 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.

protected $table = 'vehiculos_automotora';

Si laravel chequea si existe esta variable y si no existe usa el plural. Veamos como quedaría este modelo.

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Vehiculo extends Model
{
    protected $table = 'vehiculos_automotora';
}

ademas de este atributo podemos añadir los siguientes

Si nuestra tabla en la base de datos no tiene timestamps, estos son create_at y update_at y son creados en la migración.

public $timestamps = false;

También le podemos definir atributos por defectos por ejemplo las luces de mi vehículo.

protected $attributes = [
        'luces' => "Luces diurnas con LEDS ",
    ];

Para evitar que su aplicación tenga una vulnerabilidad de tipo mass assignment. debe especificar lo siguiente:

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.

protected $fillable = ['name'];// estoy haciendo mass assigment estos atributos

con guarded:

protected $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.

App\<model>::<algun comando del eloquent>

Veamos un ejemplo en una ruta(ver rutas en laravel). Recuerda los closures?

Route::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 de el namespace usando la palabra clave use.

use <nombre_modelo>

Ejemplo con un controlador para vehículo.

<?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

Ayudame: Por favor deja un comentario antes de irte, tu opinión es bienvenida. Si te gusta el contenido comparte.