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

De WikiEducator
Saltar a: navegación, buscar
Línea 72: Línea 72:
 
//por defecto la establecida en el fichero de configuración
 
//por defecto la establecida en el fichero de configuración
 
protected $connection = 'otra_conexión';
 
protected $connection = 'otra_conexión';
 +
}
  
 +
</source>
 +
}}
 +
===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'''''
 +
<source lang=bash>
 +
php artisan make:resource Producto
 +
</source>
 +
*Esta acción creará la clase /App/Http/Resource/Producto.php
 +
<source lang=php>
 +
<?php
 +
namespace App\Http\Resources;
  
  
 +
use Illuminate\Http\Resources\Json\JsonResource;
  
 +
class Producto extends JsonResource
 +
{
 +
    /**
 +
    * Transform the resource into an array.
 +
    *
 +
    * @param  \Illuminate\Http\Request  $request
 +
    * @return array
 +
    */
 +
    public function toArray($request)
 +
    {
 +
        return parent::toArray($request);
 +
    }
 +
}
 +
</source>
 +
*Previamente hemos creado le modelo, controlador, migración y factory de producto
 +
<source lang=php>
 +
php artisan make:model Producto -a
 +
</source>
 +
*Esta acción nos creará las siguientes clases
 +
;modelo
 +
App/Http/Producto.php
 +
*En este caso queremos cambiar algún atributo de los asignados por defecto, ya que voy a trabajar con una tabla que ya tenía
 +
<?php
  
 +
namespace App;
  
 +
use Illuminate\Database\Eloquent\Model;
  
 +
class Producto extends Model
 +
{
 +
    protected $table ="producto"; //Por defecto productos
 +
    protected $primaryKey="cod"; //Por defecto Id
 +
    public $incrementing = false; //Por defecto true
 +
    //
 +
}
  
   
+
;controlador
 +
APP/Http/Controller/ProductoController.php
 +
<source lang=php>
 +
<?php
  
 +
namespace App\Http\Controllers;
  
 +
use App\Producto as Producto ;
 +
use App\Stock as Stock ;
 +
use Illuminate\Http\Request;
 +
use Illuminate\Support\Facades\App;
  
  
}
+
class ProductoController extends Controller
 +
{
 +
    /**
 +
    * Display a listing of the resource.
 +
        index: Lo utilizaremos para mostrar la página inicial.
 +
    *
 +
    * @return \Illuminate\Http\Response
 +
    */
 +
    public function index()
 +
    {
 +
        //
 +
    }
  
 +
    /**
 +
    * Show the form for creating a new resource.
 +
          create: Lo utilizaremos para mostrar el formulario de registro.
 +
    *
 +
    * @return \Illuminate\Http\Response
 +
    */
 +
    public function create()
 +
    {
 +
        //
 +
    }
  
 +
    /**
 +
    * Store a newly created resource in storage.
 +
    store: Este método es importante, lo usaremos para recuperar los datos escritos en el formulario y lo guardaremos en nuestra base de datos.
 +
    *
 +
    * @param  \Illuminate\Http\Request  $request
 +
    * @return \Illuminate\Http\Response
 +
    */
 +
    public function store(Request $request)
 +
    {
 +
        //
 +
    }
  
 +
    /**
 +
    * Display the specified resource.
  
 +
      show para mostrar un registro concreto
 +
    *
 +
    * @param  \App\producto  $producto
 +
    * @return \Illuminate\Http\Response
 +
    */
 +
    public function show(producto $producto)
 +
    {
 +
        //
 +
    }
  
</source>
+
    /**
 +
    * Show the form for editing the specified resource.
 +
edit: Con este método mostraremos el formulario de edición.
 +
    *
 +
    * @param  \App\producto  $producto
 +
    * @return \Illuminate\Http\Response
 +
    */
 +
    public function edit(producto $producto)
 +
    {
 +
        //
 +
    }
  
 +
    /**
 +
    * Update the specified resource in storage.
 +
    *
 +
update: Con este método editaremos el registro.
 +
 +
    * @param  \Illuminate\Http\Request  $request
 +
    * @param  \App\producto  $producto
 +
    * @return \Illuminate\Http\Response
 +
    */
 +
    public function update(Request $request, producto $producto)
 +
    {
 +
 +
        //
 +
    }
 +
 +
    /**
 +
    * Remove the specified resource from storage.
 +
    *
 +
    * @param  \App\producto  $producto
 +
    * @return \Illuminate\Http\Response
 +
    */
 +
    destroy: Lo utilizaremos para eliminara un registro.
 +
    public function destroy($cod){
 +
 +
    }
 +
}
 +
 +
</source>
 +
;migración
 +
;factory
  
  
}}
 
  
  

Revisión de 09:20 28 feb 2020



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


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  
$primaryKey="otro_nombre"; // por defecto id
$incrementing=false; //por defecto true
$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
$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
 php artisan make:resource Producto
  • Esta acción creará la clase /App/Http/Resource/Producto.php
<?php
namespace App\Http\Resources;
 
 
use Illuminate\Http\Resources\Json\JsonResource;
 
class Producto extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request)
    {
        return parent::toArray($request);
    }
}
  • Previamente hemos creado le modelo, controlador, migración y factory de producto
 php artisan make:model Producto -a
  • Esta acción nos creará las siguientes clases
modelo
App/Http/Producto.php
  • En este caso queremos cambiar algún atributo de los asignados por defecto, ya que voy a trabajar con una tabla que ya tenía

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Producto extends Model {

   protected $table ="producto"; //Por defecto productos
   protected $primaryKey="cod"; //Por defecto Id
   public $incrementing = false; //Por defecto true
   //

}

controlador
APP/Http/Controller/ProductoController.php
<?php
 
namespace App\Http\Controllers;
 
use App\Producto as Producto ;
use App\Stock as Stock ;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\App;
 
 
class ProductoController extends Controller
{
    /**
     * Display a listing of the resource.
        index: Lo utilizaremos para mostrar la página inicial.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        //
    }
 
    /**
     * Show the form for creating a new resource.
          create: Lo utilizaremos para mostrar el formulario de registro.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        //
    }
 
    /**
     * Store a newly created resource in storage.
     store: Este método es importante, lo usaremos para recuperar los datos escritos en el formulario y lo guardaremos en nuestra base de datos.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        //
    }
 
    /**
     * Display the specified resource.
 
      show para mostrar un registro concreto
     *
     * @param  \App\producto  $producto
     * @return \Illuminate\Http\Response
     */
    public function show(producto $producto)
    {
        //
    }
 
    /**
     * Show the form for editing the specified resource.
edit: Con este método mostraremos el formulario de edición.
     *
     * @param  \App\producto  $producto
     * @return \Illuminate\Http\Response
     */
    public function edit(producto $producto)
    {
        //
    }
 
    /**
     * Update the specified resource in storage.
     *
update: Con este método editaremos el registro.
 
     * @param  \Illuminate\Http\Request  $request
     * @param  \App\producto  $producto
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, producto $producto)
    {
 
        //
    }
 
    /**
     * Remove the specified resource from storage.
     *
     * @param  \App\producto  $producto
     * @return \Illuminate\Http\Response
     */
    destroy: Lo utilizaremos para eliminara un registro.
    public function destroy($cod){
 
    }
}
migración
factory





Class Usuario extends Eloquent{ }

  • Por convención la clase Usuario interactuaría con el modelo usuarios
  • Pero podemos especificar el nombre de la tabla que es un atributo de la clase

Class Usuario extends Eloquent{

  protected $table = 'usuarios';

}

  • Otras propiedades que podemos utilizar que tienen valor por defecto pero podemos modificar

Class Usuario extends Eloquent{

  protected $table = 'usuarios';
  protected $connection = 'tienda'; //Por defecto la conexión mysql de database.php
  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

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();