Laravel, parte 5: Modelos

Bueno, en la última publicación vimos cómo crear una tabla en nuestra base de datos, gracias a las migraciones, en esta publicación vamos aprender a trabajar con registros mediante los modelos.

Recordar que en una entrada anterior habíamos hablado del Modelo Vista Controlador, y habíamos dicho que los modelos eran clases que representaban tablas de una base de datos. Además que esa clases tenían métodos que tendrían una suerte de consulta y cada objeto instanciado sería un registro.

Eloquent

Una de las cosas más densas, pero necesarias al desarrollar una aplicación web es tener que crear las consultas para la base de datos, además que estas consultas suelen repetirse entre tabla y tabla. Insertar registros, modificarlos, eliminarlos, buscar un registro por su id, listar registros, etc. Eloquent es una clase ORM de Laravel que nos permitirá solucionar este problema.

Para comenzar vamos a crear un modelo para representar la tabla que creamos, la tabla users. Así que dentro de nuestro proyecto vamos a app -> models y creamos un archivo php llamado User.php. Probablemente ya exista un modelo con este nombre ya que Laravel 4 lo crea por defecto, de ser así lo eliminamos. El código quedará así:

<?php
class User extends Eloquent {
}
?>

Ahora, tal vez no lo hayas notado, pero la tabla se en la base de datos para guardar se llama users, mientras que el modelo es User. Bueno, esto se debe a una modalidad de Laravel en donde las tablas se escriben en plural, mientras que los modelos con la primer letra en mayúscula y en singular. Si nuestra tabla tuviese otro nombre que no respetara esta regla entonces tendríamos que forzar a nuestro modelo a llamar a una tabla con otro nombre, agregando una propiedad protegida $table de esta forma:

<?php
class User extends Eloquent {
   protected $table = 'otro_nombre_para_la_tabla';
}
?>

Pero como no es nuestro caso, entonces dejaremos la clase cómo estaba antes y Laravel dará por hecho que el modelo User hará referencia a la tabla users.

Ok, ahora, para continuar vamos a aprender qué es lo que podemos hacer gracias a Eloquent.

En primer lugar vamos a ir a app -> routes.php y vamos a agregar las siguientes líneas:

Route::get('test', function(){
   //Acá escribiremos el código.
});

Nada, nuevo, una nueva acción para nuestras rutas, pero esta nos servirá para ir viendo lo que aprenderemos de Eloquent. Así que todos los ejemplos que dé a continuación podés escribirlos dentro de esa función y probarlo en:

https://localhost:8000/test

Además debemos asegurarnos de tener el servicio de base de datos corriendo, en mi caso MySQL e iniciar nuestro servidor con:

php artisan serve

Esto ya deberías saberlo, pero por si acaso lo repasamos.

Insertar registros

Para insertar nuevos registros debemos usar el método save().

Recordemos que en nuestro modelo la forma de representar un registro es mediante objetos instanciados de ese modelo, por tanto para crear un nuevo usuario deberíamos hacer esto:

Route::get('test', function() {
   $user = new User();
   $user->email = 'cosme_fulanito@mail.com';
   $user->real_name = 'cosme';
   $user->password = Hash::make('1234');
   $user->level = 1;
   $user->active = true;
   $user->save();
   return 'Usuario insertado correctamente.';
});

Bien, en primer lugar creamos un nuevo objeto User, si ya has trabajado con objetos esto no debería ser un problema para vos. Luego le seteamos las propiedades, que por supuesto tienen el mismo nombre que las columnas de la tabla users.

$user = new User();
$user->email = 'cosme_fulanito@mail.com';
$user->real_name = 'cosme';
$user->password = Hash::make('1234');
$user->level = 1;
$user->active = true;

Algo a tener en cuenta es que el password lo guardamos hasheado, gracias a la clase Hash y el método make(). Seguro, si ya trabajaste con bases de datos y con contraseñas sabrás que por una cuestión de seguridad las contraseñas deberían guardarse hasheadas o encriptadas.

Finalmente para guardar el registro usamos el método save() y retornamos un mensaje indicando que el registro se ha insertado:

$user->save();
return 'Usuario insertado correctamente.';

Recuperar registros por su id

Si quisiéramos recuperar, por ejemplo, el registro que acabamos de insertar por su id o clave primaria deberíamos usar el método estático find() que recibirá como parámetro el id del usuario y nos devolverá un objeto con el registro del mismo:

$user = User::find(1);
return $user->real_name;

Donde es 1, debe ir el id correspondiente.

Modificar registros

Combinando lo último que acabamos de aprender podemos modificar un registro, primero recuperándolo con el método find(), seteando la propiedades que queremos modificar y por último llamar al método save() para que los cambios se realicen en la base de datos:

Route::get('test', function() {
   $user = User::find(1);
   $user->real_name = 'fulanito';
   $user->save();
   return 'El registro ha sido modificado';
});

Si lo que en cambio queremos hacer es recuperar un registro por una propiedad específica, por ejemplo el real_name deberíamos hacer algo como esto:

Route::get('test', function() {
   $user = User::where('real_name', 'fulanito')->first();
   return $user->email;
});

Como vemos en el ejemplo, llamamos al método where() desde la clase User, este método recibirá como primer parámetro el nombre de la propiedad y como segundo el valor. Además debemos encadenar el resultado con el método first() que nos devolverá el primer registro que encuentre. En el caso del real_name no debería haber dos registros con el mismo, pero igual debemos usarlo de esta forma.

Eliminar registros

Para eliminar registros debemos usar la misma lógica que para modificar, sólo que en lugar de usar el método save() lo haremos con delete():

Route::get('test', function() {
   $user = User::find(1);
   $user->delete();
   return 'Registro eliminado';
});

Recuperar lista de registros

Si quisiéramos recuperar por ejemplo la lista de usuarios que han sido insertados podemos llamar al método all() que como su nombre lo indica nos devolverá todos los usuarios:

Route::get('test', function() {
   $users = User::all();
   $nombres = '';
   foreach($users as $item){
      $nombres .= $item->real_name . '<br />';
   }
   return $nombres;
});

Pero si en cambio queremos hacer un filtro, por ejemplo recuperar todos los usuarios con el valor de la propiedad active en true, y ordenados por el real_name deberíamos hacer algo como esto:

Route::get('test', function() {
   $users = User::where('active', true)->orderBy('real_name')->get();
   $nombres = '';
   foreach($users as $item){
      $nombres .= $item->real_name . '<br />';
   }
   return $nombres;
});

Como se ve en el ejemplo a través de la clase User llamamos el método where(), para traer todos los registros que cumplan con esa condición, que sean active true, además encadenamos el método orderBy() para ordenar esos registros por su real_name, y finalmente llamamos al método get() que nos devolverá un array con los registros encontrados.

Bueno, acá terminamos, si tenés dudas, o querés aprender más podés consultar a la documentación de Eloquent:

https://four.laravel.com/docs/eloquent

Saludos!

Anterior: Laravel, parte 4: Migraciones

Siguiente: Laravel, parte 6: Controladores

 

Redes sociables

    10 Replies to “Laravel, parte 5: Modelos”

      1. Estás concatenando los nombres dentro de una variable.Eso? No entiendo bien la pregunta.

        Saludos!

    1. FER, en el caso de que yo en el routes.php escriba la ruta –
      Route::get(‘test’, function(){

      $user = new User();
      $user->email = ‘cosme_fulanito@mail.com’;
      $user->real_name = ‘cosme’;
      $user->password = Hash::make(‘1234’);
      $user->level = 1;
      $user->active = true;
      $user->save();
      return ‘Usuario insertado correctamente.’;
      });

      luego de escribir http://localhost/laravel/public/test me debería aparecer un registro en la base de datos no?. Porque si fuera así, no me aparece nada en mysql si la tabla de users. Saludos

    Comments are closed.