Diferencia entre revisiones de «Usuario:ManuelRomero/Laravel/eloquent»

De WikiEducator
Saltar a: navegación, buscar
 
(14 revisiones intermedias por el mismo usuario no mostrado)
Línea 1: Línea 1:
 
{{:Usuario:ManuelRomero/micursos/Laravel/baseDatos/nav}}
 
{{:Usuario:ManuelRomero/micursos/Laravel/baseDatos/nav}}
 +
{{TOC}}
 +
<div class=parrafo>
 
===Eloquent===
 
===Eloquent===
 
*Eloquent es un '''modelo objeto-Relacional''' '''''ORM''''' que se implementa en laravel.
 
*Eloquent es un '''modelo objeto-Relacional''' '''''ORM''''' que se implementa en laravel.
*Esta una clase que nos va a permitir trabajar de forma sencilla y muy productiva con una base de datos
+
*De esta forma se va a establecer una clase (el modelo) nos va a permitir trabajar de forma sencilla y muy productiva con una base de datos.
*Para usarlo partimos de la idea de que cada tabla de  la base de datos con la que trabajamos tiene un modelo creado en nuestro proyecto .
+
*El modelo (la clase) se va a relacionar con una tabla en la bd.
*Cada modelo permite trabajar con esa tabla.
+
{{Tip|
*Los modelos los crearemos en la carpeta apt/models
+
*Para utilizarlo cada tabla de  la base de datos con la que trabajamos va a tener  un modelo creado en nuestro proyecto .
 +
}}
 +
*Los modelos que cremos con '''''artisan'''''  se ubicaran en la carpeta de nuestro proyecto '''''app/Http/model'''''
 
{{MRM_Actividad|Title=Crear un modelo (Alumno)|
 
{{MRM_Actividad|Title=Crear un modelo (Alumno)|
 
  php artisan make:model Alumno
 
  php artisan make:model Alumno
 
*Crea una clase llamada Alumno en el dir '''''app'''''
 
*Crea una clase llamada Alumno en el dir '''''app'''''
 +
}}
 +
*Como los diferentes comandos, tenemos una serie de opciones en su creación que podemos ver con la opción '''''-h'''''
 +
<br />
 +
{{MRM_Actividad|Title=Crear un modelo (Alumno)|
 +
<source lang=bash>
 +
php artisan -h make:model
 +
</source>
 
}}
 
}}
{{MRM_Actividad|Title=Crear un modelo (Alumno) con migración|
+
 
  php artisan make:model Alumno --migration
+
 
 +
{{Actividad|Title=Crear un modelo (Alumno) con #migración, #seeder, #factory y  #controlador resource |
 +
  php artisan make:model Alumno --all
 
o
 
o
  php artisan make:model Alumno -m
+
  php artisan make:model Alumno -a
 
}}
 
}}
  
Línea 19: Línea 32:
 
;ORM realciona un modelo con una tabla
 
;ORM realciona un modelo con una tabla
 
*Por defecto se asumen una serie de valores que se pueden modificar en el modelo
 
*Por defecto se asumen una serie de valores que se pueden modificar en el modelo
*Para ello habría que establecer valores a otros atributos
+
*Para ello habría que establecer valores a otros atributos en la clase
 +
{{Nota|Ponemos el ejemplo de haber creado un modelo llamado User}}
 +
<source lang=php>
 +
<?php
  
;Nombre de tabla
+
namespace App;
{| style="border:1px solid #B8C7D9; text-align:left;  background:#f5faff; font-size: 95%;"
+
|-
+
| width="25%" style="background: #cedff2; padding: 3px 5px; text-align:center;"|'''Modelo'''
+
| style="background: #cedff2; padding: 3px 5px; text-align:center;"|'''Tabla'''
+
| width="50%" style="background: #cedff2; padding: 3px 5px; text-align:center;"|'''Atributo para modificar'''
+
|-
+
|style="padding: 3px 5px; text-align:center;"|
+
'''Alumno'''
+
|style="padding: 3px 5px; text-align:center;"|
+
'''alumnos'''
+
|style="padding: 3px 5px; text-align:center;"|
+
'''protected $table='otroNombreTabla'''
+
|-
+
  
|}
+
use Illuminate\Database\Eloquent\Model;
  
 +
class User extends Model
 +
{
 +
   
 +
//Nombre de la tabla
 +
//por defecto el nombre del modelo en plural
 +
//y minúscula
 +
protected $table = 'nombre_tabla'; //por defecto users,
  
}}
 
  
 +
//Clave principal
 +
//Por defecto id de tipo int autoincrement 
 +
protected $primaryKey="otro_nombre"; // por defecto id
 +
public $incrementing=false; //por defecto true
 +
protected $keyType="string";// por defecto int
  
 +
//Timestamps
 +
//Por defecto espera gestinar dos campos
 +
//created_at y updated_at
 +
//Información temporar de cuándo modificación de valores
 +
//Si no van a existir en la tabla
 +
public $timestamps = false;//Por defecto true
  
 +
//Cambiar el nombre de los campos de timestamps
 +
//por defecto created_aty updated_at
 +
const CREATED_AT = 'fecha_creacion';  //por defecto created_at
 +
const UPDATED_AT = 'ultima_actualizacion';//por defecto updated_at
  
 +
//Formato de fechas
 +
//Si quieres especificar uno concreto
 +
protected $dateFormat = 'U';
  
 +
//Contexión a la BD
 +
//por defecto la establecida en el fichero de configuración
 +
protected $connection = 'otra_conexión';
 +
}
  
 +
</source>
 +
}}
 +
</div>
  
 +
<div class=parrafo>
 +
===Creando las rutas===
 +
*Cuando queremos gestionar  una tabla de forma completa (CRUD) debemos atender a eventos con diferentes significados
 +
#Un submit para agregar un registro (C)
 +
#Un submit para agregar Editar un registro y otro para guardarlo(RU)
 +
#Un submit para eliminar un registro (D)
 +
*Esto puede generar un pequeño caos en nuestro web.php, especialmente si tenemos varias tablas (modelos) creados
 +
*Para ello laravel utiliza lo que llama '''''Resources'''''
 +
*Especificaremos en el fichero '''''web.php''''' directamente el uso de un recurso
  
  
 +
<source lang=bash>
 +
Route::resource("cliente", App\Http\Controllers\AlumnoController::class);
 +
</source>
 +
*Y de esta forma ya tenemos disponibles todos las rutas para trabajar de forma RestFull con nuestro controlador ''''''ClienteController''''', enfocado a interactuar con la tabla '''''clientes'''''' de la BD a través del modelo '''''Cliente'''''
 +
*Un RestFull, especifica que podremos realizar todas las acciones (lógicamente escribiendo el código) en los métodos correspondinetes al controlador ante las solicitudes.
 +
*Pero ya tenemos establecidas '''''De qué forma se va a solicitar el recuros''''' y '''''qué método va a invocarse'''''
 +
Vemos las rutas que se crean, y los métodos que se van a invocar A cont
 +
  GET            Cliente ..................... Cliente.index    index
 +
  POST            Cliente .......  ............ Cliente.store    store
 +
  GET            Cliente/create .. ........... Cliente.create  create
 +
  GET            Cliente/{Cliente}  .......... Cliente.show    show
 +
  PUT            Cliente/{Cliente} ........... Cliente.update  update
 +
  DELETE          Cliente/{Cliente} ........... Cliente.destroy  destroy
 +
  GET            Cliente/{Cliente}/edit....... Cliente.edit    edit
 +
<br />
  
 +
{{MRM_Actividad|Title=Listar usuarios : index|
 +
;Listar todos los Clientes
  
 +
}}
  
Class Usuario extends Eloquent{
+
{{MRM_Actividad|Title=Crear un nuevo cliente: create - store|
}
+
;Crear un nuevo cliente
*Por convención la clase '''''Usuario''''' interactuaría con el modelo '''''usuarios'''''
+
*1.-Mostrar un formulario para aportar los datos
*Pero podemos especificar el nombre de la tabla que es un atributo de la clase
+
*2.-Guardar los datos en la BD
Class Usuario extends Eloquent{
+
*3.-Listar y mostrar todos los clientes
  protected $table = 'usuarios';
+
 
}
+
}}
*Otras propiedades que podemos utilizar que tienen valor por defecto pero podemos modificar
+
{{MRM_Actividad|Title=Mostrar un cliente : show|
Class Usuario extends Eloquent{
+
;Mostrar un cliente concreto
  protected $table = 'usuarios';
+
*1.-Recuperar los datos de un cliente
  protected $connection = 'tienda'; //Por defecto la conexión mysql de database.php
+
*2.- Visualizarlos en una vista
  protected $primaryKey = 'codigo'; //Por defecto id
+
 
  protected $timestamps = 'false'; //Por defecto true para actualizar los campos create_at update_up
+
 
}
+
}}
*Como vemos el modelo da por supuesto que existen una serie de campos en la tabla, si no es así hay que especificarlo
+
{{MRM_Actividad|Title=Modificar un cliente: edit - update|
 +
*1.-Recuperar los datos de un cliente
 +
*2.-Visualizarlos en un formulario para poder modificarlos
 +
*2.-Actualizar el cliente en la BD
 +
*3.-Listar y mostrar todos los clientes
 +
 
 +
 
 +
}}
 +
{{MRM_Actividad|Title=Borrar un cliente: destroy|
 +
;Borrar un cliente
 +
*1.-Recuperar los datos de un cliente
 +
*2.-Borrarlo en la BD
 +
*3.-Listar y mostrar todos los clientes
 +
}}
 +
</div>
  
 +
<div class=parrafo>
 
===Interactuando con la tabla===
 
===Interactuando con la tabla===
 
*Para obtener todos los registros de la tabla '''''all()'''''
 
*Para obtener todos los registros de la tabla '''''all()'''''
Línea 129: Línea 205:
  
 
</source>
 
</source>
 +
</div>
 +
 +
===Mostrando mensaje de acciones realizadas===
 +
*En el controlador donde se haya creado el registro
 +
<source lang=php>
 +
public function  xxxxxx{
 +
\Session::flash("mensaje_accion", "Se ha creado el registro");
 +
 +
}
 +
 +
 +
</source>
 +
 +
 +
<source lang=php>
 +
<div class="container>
 +
@if (Session::has("mensaje_accion"))
 +
<button type="button" class="close" data-dismisss="alert" aria-hidden="true">&times;</button>
 +
{{Session::get("mensaje_accion")}}
 +
</div>
 +
</source>
 +
===Pedir confirmación de acción de borrado===

Última revisión de 16:51 28 mar 2023



Eloquent

  • Eloquent es un modelo objeto-Relacional ORM que se implementa en laravel.
  • De esta forma se va a establecer una clase (el modelo) nos va a permitir trabajar de forma sencilla y muy productiva con una base de datos.
  • El modelo (la clase) se va a relacionar con una tabla en la bd.
Icon present.gif
Tip:
  • Para utilizarlo cada tabla de la base de datos con la que trabajamos va a tener un modelo creado en nuestro proyecto .


  • Los modelos que cremos con artisan se ubicaran en la carpeta de nuestro proyecto app/Http/model


Icon activity.jpg
Crear un modelo (Alumno)
php artisan make:model Alumno
  • Crea una clase llamada Alumno en el dir app



  • Como los diferentes comandos, tenemos una serie de opciones en su creación que podemos ver con la opción -h



Icon activity.jpg
Crear un modelo (Alumno)
 php artisan -h make:model






Icon activity.jpg

Crear un modelo (Alumno) con #migración, #seeder, #factory y #controlador resource

php artisan make:model Alumno --all

o

php artisan make:model Alumno -a






Icon activity.jpg
Laravel modelo-tabla
ORM realciona un modelo con una tabla
  • Por defecto se asumen una serie de valores que se pueden modificar en el modelo
  • Para ello habría que establecer valores a otros atributos en la clase

(Comment.gif: Ponemos el ejemplo de haber creado un modelo llamado User)


<?php
 
namespace App;
 
use Illuminate\Database\Eloquent\Model;
 
class User extends Model
{
 
//Nombre de la tabla 
//por defecto el nombre del modelo en plural
//y minúscula
protected $table = 'nombre_tabla'; //por defecto users,
 
 
//Clave principal
//Por defecto id de tipo int autoincrement  
protected $primaryKey="otro_nombre"; // por defecto id
public $incrementing=false; //por defecto true
protected $keyType="string";// por defecto int
 
//Timestamps
//Por defecto espera gestinar dos campos
//created_at y updated_at
//Información temporar de cuándo modificación de valores
//Si no van a existir en la tabla
public $timestamps = false;//Por defecto true
 
//Cambiar el nombre de los campos de timestamps
//por defecto created_aty updated_at
const CREATED_AT = 'fecha_creacion';  //por defecto created_at
const UPDATED_AT = 'ultima_actualizacion';//por defecto updated_at
 
//Formato de fechas
//Si quieres especificar uno concreto
protected $dateFormat = 'U';
 
//Contexión a la BD
//por defecto la establecida en el fichero de configuración
protected $connection = 'otra_conexión';
}



Creando las rutas

  • Cuando queremos gestionar una tabla de forma completa (CRUD) debemos atender a eventos con diferentes significados
  1. Un submit para agregar un registro (C)
  2. Un submit para agregar Editar un registro y otro para guardarlo(RU)
  3. Un submit para eliminar un registro (D)
  • Esto puede generar un pequeño caos en nuestro web.php, especialmente si tenemos varias tablas (modelos) creados
  • Para ello laravel utiliza lo que llama Resources
  • Especificaremos en el fichero web.php directamente el uso de un recurso


Route::resource("cliente", App\Http\Controllers\AlumnoController::class);
  • Y de esta forma ya tenemos disponibles todos las rutas para trabajar de forma RestFull con nuestro controlador 'ClienteController, enfocado a interactuar con la tabla clientes' de la BD a través del modelo Cliente
  • Un RestFull, especifica que podremos realizar todas las acciones (lógicamente escribiendo el código) en los métodos correspondinetes al controlador ante las solicitudes.
  • Pero ya tenemos establecidas De qué forma se va a solicitar el recuros y qué método va a invocarse

Vemos las rutas que se crean, y los métodos que se van a invocar A cont

 GET             Cliente ..................... Cliente.index    index
 POST            Cliente .......  ............ Cliente.store    store
 GET             Cliente/create .. ........... Cliente.create   create
 GET             Cliente/{Cliente}  .......... Cliente.show     show
 PUT             Cliente/{Cliente} ........... Cliente.update   update
 DELETE          Cliente/{Cliente} ........... Cliente.destroy  destroy
 GET             Cliente/{Cliente}/edit....... Cliente.edit     edit




Icon activity.jpg
Listar usuarios : index
Listar todos los Clientes





Icon activity.jpg
Crear un nuevo cliente: create - store
Crear un nuevo cliente
  • 1.-Mostrar un formulario para aportar los datos
  • 2.-Guardar los datos en la BD
  • 3.-Listar y mostrar todos los clientes





Icon activity.jpg
Mostrar un cliente : show
Mostrar un cliente concreto
  • 1.-Recuperar los datos de un cliente
  • 2.- Visualizarlos en una vista






Icon activity.jpg
Modificar un cliente: edit - update
  • 1.-Recuperar los datos de un cliente
  • 2.-Visualizarlos en un formulario para poder modificarlos
  • 2.-Actualizar el cliente en la BD
  • 3.-Listar y mostrar todos los clientes






Icon activity.jpg
Borrar un cliente: destroy
Borrar un cliente
  • 1.-Recuperar los datos de un cliente
  • 2.-Borrarlo en la BD
  • 3.-Listar y mostrar todos los clientes



Interactuando con la tabla

  • Para obtener todos los registros de la tabla all()
$usuarios = Ususario::all();
foreach( $usuarios as $usuario){
    echo $usuario->nombre;
}

Sería equivalente a hacer

Select * from usuarios;
  • Obetener un solo registro (necesitamos para ello usar compos únicos como $id
$id=58;
$usuario = Ususario::find($id);
  • Obtener solo algún campo de la tabla
$id=58;
$usuario = Ususario::find($id, array('nombre'));
echo "Usuario encontrado ". $usuario->nombre;
8
  • Obetener registros que cumplan una condicion where(..)->get()
$usuarios = Ususario::where('edad','>',18)->get();
foreach( $usuarios as $usuario){
    echo $usuario->nombre;
}
  • Podemos usar una serie de métodos mágicos del tipo whereNombreColumna
//Todos los usuarios de 20 años
$usuarios = Ususario::whereEdad(20)->get();
foreach( $usuarios as $usuario){
    echo $usuario->nombre;
}
Insertar registros save()
  • Para insertar registros simplemente asignaremos valor a cada campo del modelo y usaremos el método save
$usuario = new Ususario;
 
$user->nombre = 'Maria';
$user->edad = 30;
$user->direccion = 'Casa de Maria';
$user->save();
Borrar registros delete()
  • Para borrar un lo localizamos y usamos el método delete()

$user = User::find(1);

$user->delete();

$usuario = Usuario::find(1);//Localizamos el usuario con id 1
 
$user->delete();

Mostrando mensaje de acciones realizadas

  • En el controlador donde se haya creado el registro
public function  xxxxxx{
\Session::flash("mensaje_accion", "Se ha creado el registro");
 
}


<div class="container>
@if (Session::has("mensaje_accion"))
<button type="button" class="close" data-dismisss="alert" aria-hidden="true">&times;</button>
{{Session::get("mensaje_accion")}}
</div>

Pedir confirmación de acción de borrado