Hacer override del update_at con save

laravel

El método save(), acepta parámetros, ello da la capacidad para decirle que ignore el la asignación que hace update_at por defecto, tomando la fecha y momento actual, haciendo esto, lo cual nos permite hacer override del update_at con save(), sin mayores problemas:

$product = Product::find($id);	
$product->updated_at = '2019-01-01 10:00:00';
$product->save(['timestamps' => false]);

Y listo, esto es todo.

Otros artículos sobre Laravel

Espero modestamente que este artículo, sirva de ayuda a alguien.

Gracias.

Subir montañas hermana hombres……

El uso de when

laravel

When() es una de los métodos con los que Laravel, sorprende a los que comienzan. El uso de when, es un recurso al que recurro cada vez que puedo, por la potencia que aporta, ya que permite crear un código más reusable.    

Veamos por ejemplo que si queremos introducir una condicional del tipo if else,  en un código podemos escribir algo asi enlazando ifs:

En el primer caso estamos diciendo algo como esto: Si filtramos lo que trae el request, por la columna likes, el valor de la variable query acogerá,    aquellos registros  en que likes, sea mayor que el valor de request donde likes_amount sea 0

if (request('filter_by') == 'likes') {
    $query->where('likes', '>', request('likes_amount', 0));
}
if (request('filter_by') == 'date') {
    $query->orderBy('created_at', request('ordering_rule', 'desc'));
}

Leer otros artículos sobre Laravel

Aquí estamos enlazando dos condiciones, que consideran el valor de unos campos para decidir que hacer.
Si usaramos when lo escribiríamos asi:

$query = Author::query();
$query->when(request('filter_by') == 'likes', function ($q) {
    return $q->where('likes', '>', request('likes_amount', 0));
});

$query->when(request('filter_by') == 'date', function ($q) {
    return $q->orderBy('created_at', request('ordering_rule', 'desc'));
});

Y lo que estamos diciendo es que la variable query, aplicará al modelo Author el método query, y que cuando el valor ejecute el filter_by a la columna likes dentro del metodo request, la función anónima se le pasara como parámetro una variable $q cuyo valor seran aquellos registros donde likes sea mayor que la likes_amount igual 0

Como vemos $q es una variable comodin que soporta el peso de la función, pues su valor variara en función del resultado.

$query = Producto::query();
$query->when(request('marca', false), function ($q, $marca) { 
    return $q->where('marcas_id', $marca);
});
$store = $query->get();

Y listo, esto es todo.

Espero modestamente que este artículo, sirva de ayuda a alguien.

Gracias.

Subir montañas hermana hombres……

Buenas prácticas para desarrollar en Laravel

laravel

Después de un tiempo desarrollando en este framework y recuperando opiniones de otros y mi propia experiencia, aquí dejo algunos de las que considero buenas prácticas de programación en Laravel

  1. Leer la documentación de Laravel, es sencilla y clara y brinda mucha información que necesitaras. Usarla como tutorial siempre a mano puede ser de gran ayuda.  
  2. Utilizar la estructura que Laravel ofrece para organizar el código por carpetas, con el enfoque que Laravel ofrece.
  3. Aprende y utiliza bien el sistema de autenticación de Laravel.
  4. Cumplir las políticas y salidas de Laravel.
  5. Mantener y los controladores y comandos ligeros. Es preferible transferir la mayor parte de la lógica a las clases, los modelos o las políticas o puertas de salida y enlace.
  6. Utilice los patrones  de migración y herramientas de Eloquent en vez de usar directamente  SQL.
  7. Usar los traits, para compartir la lógica y el comportamiento de los modelos.
  8. Aprovechar las ventajas de la metodología de frontend, basada en componentes de javascript, en vez de abusar del uso de Blade, Laravel esta preparado para integrarse a Vue, React, incluso  Angular.
  9. Explote al máximo las  prácticas REST en sus controladores y use tantos controladores como necesite, tambien aproveche a los controladores de acción única :__invoke()
  10. Establezca principios coherentes para obtener las  respuestas de las solicitudes, que ofrece Laravel, como la API JSON y use UUID, cuando pueda.
  11. Cree componentes, lo que facilitara, la estructura de su código, y su consumo, por la aplicación.
  12. Utilice comandos para tareas manuales, incluso para aquellas que algunas que pueden ser programadas, ya que pueden servirle para aliviar la carga de su aplicación.
  13. Resuelva el problema n+1, siguiendo la documentación de ayuda, ya que Eloquent, no tiene filtro para limitar  las consultas sql, por tanto hay que prestar atención  a la cargas del tipo lazy y eager.
  14. Aprender y usar los comandos de Artisan y sus utilidades.
  15. Oculte la estructura de la base de datos a través de objetos de respuesta
  16. Laravel permite desarrollar fachadas propias, el desconocimiento a veces invita a crearlas. No haga abuso de ellas, si puede implementar el uso de los métodos de una fachada ya predefinida por Laravel.
  17. Use paquetes de terceros con moderación y solo aquellos que estén bien mantenidos.
  18. Haga pruebas, escriba pruebas para todo cuanto desarrolle.
  19. Comente  el código de manera explicita.
  20. Documéntese, estudie. Una buena referencia son los sitios de Laracon en Youtube, los foros de los foros en el sitio de Jeffrey Way, Laracasts.com,  los foros de Vuejs.org , el foro de  Adam Wathan para Laravel, Vue, Tailwind y  el de Wes Bos para Javascript. Pueden serle útiles. Algunos serán de pago, pero pueden valer la pena.

Y listo, esto es todo.

Espero modestamente que este artículo, sirva de ayuda a alguien.

Gracias.

Metodos Raw

laravel

Para añadir consultas tipo Raw  en Eloquent, contamos con algunos métodos muy útiles. Aquí muestro  ejemplos con tres  metodos Raw ( whereRaw, havinRaw y orderByRaw)

 // whereRaw
$orders = DB::table('orders')
    ->whereRaw('price > IF(state = "TX", ?, 100)', [200])
    ->get();

// havingRaw
Product::groupBy('category_id')->havingRaw('COUNT(*) > 1')->get();

// orderByRaw
User::where('created_at', '>', '2016-01-01')
  ->orderByRaw('(updated_at - created_at) desc')
  ->get();

Y listo, esto es todo.

Más sobre Laravel en mi blog

Espero modestamente que este artículo, sirva de ayuda a alguien.

Gracias.

Subir montañas hermana hombres……

Estructura Prestashop

logo prestashop

Analizando la estructura de Prestashop, el cual tuve que regresar, hace unos días, y con más de tiempo disponible, explicaré como funciona.

Prestashop funciona bajo el sistema  modelo, vista, controlador,  y por tanto tiene muy bien estructurado la separación lógica de estos tres componentes.

Los archivos con la extensión tpl, se encargan de las vistas, Smarty es su gestor de base de datos y están los modulos que ejecutan acciones complejas dentro del Framework.

Orientado a objetos

Prestashop está orientado a objetos, o al menos lo simula con bastante decencia, por ello todos sus módulos actúan como objetos y extienden de diferentes clases, además poseen un hook del cual cuelgan. Los modulos poseen casi todos una vista y un controlador, del cual extienden funcionalidades.

Cuando Prestashop se instala, se instalan un conjunto de módulos básicos y luego cada tema o plantilla incorporara, los suyos propios que tendrán prioridad sobre los del sistema si llegan a coincidir.

Por tanto veremos que dentro de cada módulo, la lógica está representada por el archivo .php, con el nombre del modulo, y la vista por el archivo con el nombre del modulo y la extensión .tpl., en algunos casos podría tener un archivo index, tambien

El core

El  core de Prestashop, se divide a su vez en una estructura de carpetas, bastante intuitiva,  las más importantes para conocer y que podríamos tener que tocar son classes ,config, themes, override, modules, tools y translation.

Debido a su utilidad y gran aceptación, y ser de código abierto, posee una vasta red de colaboradores.

Los cambios más  drásticos seguramente serán aquellos que realicemos en modulos y themes, pero los que hagamos en los archivos php dentro de los módulos son los que más cuidado requieren .

Los cambios en la lógica deben hacerse en el nombredelmodulo.php. Debo decir que Prestashop asimila perfectamente php nativo, por tanto las modificaciones no requieren mucho más que conocer este lenguaje, pero cuidado, porque deberán luego adecuar también los efectos de estas modificaciones en la vista si fuera necesario, por diferentes vías, algunas de ellas por ejemplo reestructurar las imágenes o limpiar la cache no requieren el uso de código  y pueden aprovecharse para ello,  las herramientas que el mismo Prestashop ofrece, otras como la modificación de traducciones,  o la corrección del código de las vistas si exigirá conocimientos de javascript, html y css.

Override

Una herramienta importante que nos da el framework es el override, con ella los cambios que hagamos, lo guardaremos  allí, eso no facilita que al actualizar a nuevas versiones, estos no se sobrescribirán y nuestras modificaciones serán protegidas.

Cambios de versiones ha habido muchos, Prestashop tiene una comunidad de desarrolladores muy activa, pero la versión 1,6 sigue siendo la mejor, mas estable, menos bugs y mejor soportada.

A pesar de todas la ventajas que la versión 1.7 ofrece no acaba de brindar la suficiente confianza a los usuarios, yo por mi parte sigo recomendando que quien tenga la versión 1.6 no la cambie.

Prestashop es potente y posee muchas soluciones a mano, que podemos aprovechar. Mi sugerencias sobre donde hacer adecuaciones, para personalizarlo por ejemplo, son estas:

La manera  mas sencilla es tocar solo los archivos dentro de la carpeta modules. Sii no es necesario tocar el php, se pueden centrar las modificaciones en los archivos tpl. Importante decir que estos mezclan html con variables y código php que se encierra entre corchetes, hay que estudiar conocer la variables, lo cual no es demasiado difícil y atender a los archivos que poseen texto entre comillas simples, estos son textos que aparecen en la plantilla y que tendrán también traducción , por tanto si se cambian, se deberá buscar en el archivo de traducciones y cambiarlo.

Prestashop ofrece una herramienta para esto,  en el  Administrador de la tienda en Herramientas/Traducciones, o  se puede hacer también hurgando en el código directamente, en la carpeta idiomas.

También ser pueden modificar la estructura de los mails, esto se logra en los archivos dentro de la carpeta mails, editándolos fácilmente.

Plantillas

La modificación de los temas o plantillas se puede hacer por varias vías, una es  tomar un tema de internet:  los hay buenos y malos, y de pago y gratis. Los temas se instalan en la  carpeta “themes”.  

La otra  y es la que yo recomiendo que si no lo tienen claro,  se crea una plantilla nueva a partir de la  que trae Prestashop por defecto que en la versión 1.6 esta muy bien y  mejorarla.

El mismo prestashop permite crear un nuevo tema desde su propio administrador en el gestor de temas, basta con poner un  nombre nuevo y decirle que toma como base el tema default,  y seleccionar los módulos que heredara de el,

La ventaja de hacer esto es que es una plantilla que funcionara al 100%, cosa que no sucede a veces con las que hay en la red.

A partir de aquí modificarla será ya mas fácil, con las herramientas de cualquier desarrollador de frontend, pero con las herramientas de desarrollo de Chrome y un buen editor y la conexión a FTP, estará hecho todo.

Y listo, esto es todo.

Espero modestamente que este artículo, sirva de ayuda a alguien.

Gracias.

…., si avanzo sígueme, si me detengo empújame, si retrocedo mátame…….

El uso del método Chunk()

laravel

El método Chunk es un método que ofrece Laravel para trabajar con colecciones. Su potencia es realmente impactante, a la hora de operar con grandes datasets, ya que nos permite separar en trozos la cantidad de datos con los que trabajar

Otros posts sobre Laravel

Si en Eloquent para obtener todos los registros de un modelo y mostrarlos en nuestro Blade,  hacemos algo asi:

$tareas = Tarea::all();
foreach ($tareas as $tarea) {
    // ...

Con Chunk haríamos esto:

Tareas::chunk(100, function ($tareas) {
    foreach ($tareas as $tarea) {
        // ...
    }
});

Y listo, esto es todo.

Espero modestamente que este artículo, sirva de ayuda a alguien.

Gracias.

Subir montañas hermana hombres……

Relaciones en Laravel

laravel

Establecer y definir correctamente las relaciones en Laravel cuando construimos una APP, es uno de los pasos más importantes para lograr una solución solida y escalable.

Las relaciones que se dan entre los modelos son la base de todo lo que haremos después.

Laravel aporta una estructura sencilla para construir sus modelos y relaciones, dentro del mundo de Eloquent, el cual aporta un conjunto de convenciones, que en esencia son estas

Convenciones de Eloquent Model

Los nombres de la tablas se escriben en minúsculas, corresponderán con el nombre del modelo y se le agrega una  s, y   si el modelo   tiene un nombre compuesto por dos palabras, la s se añade al final de todo, separando las palabras con una guion bajo.

De este modo , la tabla del modelo Cliente sería clientes y la de ClienteLike sería cliente_likes.
El campo primary key de una tabla debe tener el nombre de id, con el atributo AUTO_INCREMENT, en laravel 5 o bigIncrements en Laravel 6.

Los modelos son clases extienden de la clase Model, un modelo al ser creado tiene esta estructura

 <?php namespace App; use Illuminate\Database\Eloquent\Model; class NombreModelo extends Model {     // } 

Es aquí donde definiremos las relaciones y estructura del modelo, esto incluye la tabla a que se refiere, los campos que deberán ser llenados dentro de su tabla, y los cambios que queramos hacer en la estructura de la tabla que corresponde al modelo.

Otros Posts sobre Laravel

Las convenciones no son inviolables, sino una guía de organizar el código y su legibilidad pero pueden cambiarse todo lo que se desee dentro del modelo.  Por ejemplo un modelo Productos variado puede quedar así

class Producto extends Model
 {
     // cambiamos el nombre de la tabla que controla el modelo en vez de productos, trabajara con mercancia
     protected $table = 'mercancia';
 // cambiamos la clave primaria, que por defecto es id pero usaremos el código ean definiendo ese campo en la propiedad  primaryKey protected $primaryKey = 'ean_code'; // Anulamos los valores por defecto de los campos  timestamp que Laravel crea automáticamente en cada tabla, cambiando su valor a false public $timestamps = false; // asignamos  un nombre de conexión diferente protected $connection = 'connection-name'; // Establecemos aquellos atributos  a los que se les pueden asignar valores protected $fillable = ['name',’fabricante’]; // Definimos en la variable guarded, los atributos que no pueden se asignados protected $guarded = ['price',’expire_date’];
 }
 <?php namespace App; use Illuminate\Database\Eloquent\Model; class Producto extends Model {     // cambiamos el nombre de la tabla que controla el modelo en vez de  productos, trabajara con mercancia     protected $table = 'mercancia';       // cambiamos la clave primaria, que por defecto es id pero usaremos  el código ean definiendo ese campo en la propiedad  primaryKey     protected $primaryKey = 'ean_code';       // Anulamos los valores por defecto de los campos  timestamp que  Laravel crea automáticamente en cada tabla, cambiando su valor a false     public $timestamps = false;       // asignamos  un nombre de conexión diferente     protected $connection = 'connection-name';       // Establecemos aquellos atributos  a los que se les pueden asignar  valores     protected $fillable = ['name',’fabricante’];       // Definimos en la variable guarded, los atributos que no pueden se  asignados     protected $guarded = ['price',’expire_date’]; } 

Las relaciones pueden ser de uno a uno, de uno  a muchos o de muchos a muchos, hay suficiente información sobre esto en la red, muy bien explicado, pero en esencia en una aplicación donde un cliente, con un buzón de correos individual,  tendrá más de un rol, y habrá varios usuarios de la misma empresa, los modelos quedarían relacionados así.

Un cliente  con un buzón de correo (de uno a uno), pertenece solo a una empresa (de uno a uno) y un cliente tiene varios roles(relación de uno a muchos)

Como puede verse las relaciones son bilaterales, por tanto la inversa es que entre buzon y cliente también es de uno a uno, entre empresa    y clientes hay una relación de muchos a  uno  y entre roles y cliente también de uno a varios.

Cuando en ambos lados la relación es de uno a muchos,  se considera una relación de muchos a muchos y debe crearse una tabla pivote que acoja solo aquellos valores de ambos modelos que no son coincidentes y que será la tabla objeto de las consultas.

Si a las relaciones son de uno a muchos de  un lado y de uno a uno en el otro, es una relación de general de uno a muchos y si ambos lados son de uno a uno, pues asi queda de uno a uno.

Uno a Uno

Ejemplo Cliente y Buzón están relacionados uno a uno

namespace App;
use Illuminate\Database\Eloquent\Model;
class Cliente extends Model
{
public function buzon()
{
return $this->hasOne('App\Buzon');
// Si el id tiene un nombre diferente al que corresponde por convención buzons_id lo especificamos
return $this->hasOne('App\Buzon', 'code_id', 'local_key');
}
}

Definimos la otra clase

namespace App;
use Illuminate\Database\Eloquent\Model;
class Dni extends Model
{
public function cliente()
{
return $this->belongsTo('App\Cliente');
// Si el id tiene un nombre diferente al que corresponde por convención clientes_id lo especificamos
return $this->belongsTo('App\Cliente', 'nombre_id', 'local_key');
}
}

Uno a Muchos

En esta caso la definición es prácticamente igual

Una Empresa tiene muchos Clientes

namespace App;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
public function clientes()
{
return $this->hasMany('App\Cliente');
// Si el id tiene un nombre diferente al que corresponde por convención clientes_id lo especificamos
return $this->hasMany('App\Cliente', 'name_id', 'local_key'); }
}

Un Cliente pertenece a una Empresa

namespace App;
use Illuminate\Database\Eloquent\Model;
class Comment extends Model
{
public function empresa() { return $this->belongsTo('App\Empresa'); }
}

Muchos a Muchos

Un Cliente tiene varios Roles

namespace App;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
public function roles() { return $this->belongsToMany('App\Role');
// Si el nombre de la tabla es diferente a lo predeterminado o el ID de la tabla tiene otro nombre.
return $this->belongsToMany('App\Role', 'cliente_roles', 'name_id', 'defin_id');
}
}

Un Rol tiene varios Clientes

namespace App;
use Illuminate\Database\Eloquent\Model;
class Role extends Model
{
public function clientes() { return $this->belongsToMany('App\Cliente');
// Si el nombre de la tabla es diferente a lo predeterminado o el ID de la tabla tiene otro nombre.
return $this->belongsToMany('App\User', 'cliente_roles', 'defin_id', 'name_id');
}
}

Aquí debemos crear una tabla intermedia, con el nombre cliente_roles, de las cual será donde obtengamos los datos. La idea básica es que esta tabla tendrá los id de las tablas que la conforman y otros campos que sean interesantes tener para nuestra aplicación

Definimos en la función withPivot los campos de la tabla intermedia, y el acceso a ellos.

namespace App;
use Illuminate\Database\Eloquent\Model;
class Cliente extends Model
{
public function roles()
{
return $this->belongsToMany('App\Role', 'cliente_roles')
->withPivot('create', 'read','update', 'delete');
}
}

Y para acceder  a los datos intermediamos la palabra pivot en la solicitud/orden  que hacemos. 

$user = App\Cliente::find(1);
foreach ($cliente->roles as $role) {
    echo $role->pivot->create;
}

Ademas podemos acceder directamente a las tablas para obtener diferentes resultados

// retorna App\Buzon
App\Cliente::first()->buzon;

Nos devolverá valores del modelo Buzon

// retorna Illuminate\Database\Eloquent\Relations\BelongsToMany
App\Cliente::first()->roles();

Nos devolverá valores del modelo Role, de acuerdo a su relación con el modelo cliente

// retorna Illuminate\Database\Eloquent\Collection
App\Cliente::first()->roles;
Nos devolverá una colección 

Y listo, esto es todo.

Espero modestamente que este artículo, sirva de ayuda a alguien.

Gracias.

…., si avanzo sígueme, si me detengo empújame, si retrocedo mátame…….

Comandos de Artisan

logo laravel

La potencia  de los comandos de Artisan, para aquellos que ya entienden algo de Laravel, es indiscutible.

Artisan posee un conjunto de comandos, que permiten que pueda aprovecharse muy bien su capacidad. Para listar estos comandos basta con escribir en la consola

  php artisan list 

e inmediatamente obtendremos:

Las opciones que disponibles con cada comando, pueden obtenerse mediante  help:

php artisan help nombre-comando 

o acortando simplemente con -h:

php artisan nombre-comando -h

Así obtendremos: la forma de usar el comando, sus argumentos , una descripción y las opciones que podemos agregar. Por ejemplo, para php artisan migrate -h  nos muestra:

Aquí nos está diciendo dice que “mígrate” es el comando para correr las migraciones y entre las opciones con que cuenta está poder indicar cuál es la base de datos por ejemplo php artisan migrate –database=tests .

Una de las grandes ventajas de esta herramienta es que tiene un conjunto de comandos dedicado a generadores, es decir, que nos permiten crear elementos como controladores, middleware, seeders, modelos, entre otros, los cuales son los que están bajo la categoría make:


Cada uno de esos generadores tiene sus propias opciones, así que puedes revisarlo con el comando help.

Artisan nos permite crear controladores sin métodos, mediante el uso de la opción plain:

php artisan make:controller PostController --plain

Abajo muestro una lista de algunos de los comandos de uso  más común.

Serve:

php artisan serve

Se utiliza para lanzar el servidor de una aplicación,  corriéndolo desde el root de nuestra app.

Este servidor viene incluido en laravel y se levanta de modo individual para cada  caso. Después de cargarlo, nos indicará donde está corriendo.   

laravel development server started on http://localhost:8000/

Si vamos al navegador, y visitamos  http://localhost:8000/,  veremos nuestra aplicación corriendo.

Para detener el servidor, utilizaremos la combinación de  las teclas Ctrl+C.  

Cambiar el namespace de la aplicación:

php artisan app:name nombre-namespace

Ver el listado completo de rutas: 

php artisan route:list


Como resultado nos mostrará un listado de todas las rutas de la aplicación, con la información sobre el método HTTP, la URI, la acción, el nombre y sus  middlewares.

Poner en modo mantenimiento nuestra aplicación:

php artisan down

Sacar la aplicacion del modo mantenimiento

php artisan up

Artisan además asimila crear comandos, lo cual es muy útil para ejecutar tareas manuales o testear comportamientos.

Crear una tabla

php artisan make:migration
create_posts_table --create posts 

Correr la migracion

php artisan migrate

Modificar una tabla existente

De este modo estariamos agregando el campo «resumen» a la tabla «articulos»

php artisan make:migration add_resumen_to_articulos_table --table="articulos"

Agregar varios campos nuevos a la tabla «users»

php artisan make:migration add_fields_to_users_table
--table="users"

Generar una llave para hashing

php artisan key:generate

Crear un middleware

Por ejemplo escribir esto para crear un middleware que verifique si el usuario tiene una sesión

php artisan make:middleware HasUserASession

Crear un modelo

El siguiente comando creara el modelo Tarea

php artisan make:model Tarea

Crear un controlador

Crear un controlador de recursos tipo REST (resource), que incluye todos los métodos del CRUD(create, read, update, delete)

php artisan make:controller TareaController --resource

Generar el código boilerplate para autenticación de usuarios

Este comando debería ejecutarse lo más pronto al iniciar tu proyecto ya que re-escribirá tus layouts y controladores de Autenticación y Usuarios

 php artisan make:auth

Y listo, esto es todo.

Espero modestamente que este artículo, sirva de ayuda a alguien.

Gracias.

Subir montañas hermana hombres……

Translate »