Laravel ERD

Esta entrada explica como realizar un ERD en Laravel, es decir, realizar un diagrama Entidad-Relación según los modelos de Eloquent.

Para ello nos valemos de un paquete de GitHub, que es el único que hemos encontrado que realmente funciona a día de hoy (2024). Este paquete se lama «Laravel ER Diagram Generator» y lo podéis encontrar aquí.

Como explican en la página del proyecto, en Linux hay que instalar un requisito:

sudo apt-get install graphviz

Para luego instalar el paquete:

composer require beyondcode/laravel-er-diagram-generator --dev

Y en mi caso (Mint/Laravel 9) así de fácil ha sido la instalación. Solo falta usarlo:

php artisan generate:erd

Y en tres líneas ya tenemos el diagrama que de otra manera hubiéramos tardado bastante más en realizar.

Cache en Laravel (REDIS)

Vamos a instalar y usar la cache de Laravel, en este caso Redis

Para instalar Redis en nuestra aplicación debemos instalarla en nuestro sistema, instalar el módulo de php y lo necesario con composer para laravel:

sudo apt install redis
sudo apt install php-redis
composer require predis/predis

sudo systemctl restart apache2

Una vez instalado debemos modificar el fichero de configuración para que use redis de cache, teniendo en cuenta que nuestro driver de cache lo cambiaríamos por «redis», y añadiríamos nuestro cliente de redis a «predis». Así, las líneas más importantes relativas a la cache y redis en nuestro fichero .env serían:

CACHE_DRIVER=redis
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
REDIS_CLIENT=predis

Una vez lo tenemos instalado todo correctamente, para usarlo debemos hacer dos cosas: cachear y actualizar la cache.

CACHEAR

Para lo primero en nuestro controlador podemos cachear de maneras diferentes, que deberemos estudiar. Yo voy a usar en este ejemplo «tags» y a encapsularlo todo en una función

        $json = Cache::tags('calculos')->rememberForever('calculo1', function () use ($request) {
             $q = Modelo->where(...)->orderby(...);
             return $q->get()->toJson();
         });
         return $json;

Como vemos en el código cacheamos el JSON del resultado del SQL para siempre, así que no ejecutaremos otra vez la SQL hasta que no se borre la cache. Y con los tags estamos agrupando todas las cache para trabajar con ellas en grupo. Por ejemplo no tendremos que ir borrando cada cache con su nombre, las borraremos en grupo.

ACTUALIZAR CACHE

Para actualizar la cache usaremos «Observers», así tendremos actualizada siempre nuestra cache. Para crear un observer haremos:

php artisan make:observer CalculosObserver --model=Modelo

Y lo editamos para que use nuestro modelo y se borre al crear, borrar o actualizar nuestro modelo

namespace App\Observers;
use App\Models\Modelo;
class CalculosObserver
{
    public function created(Modelo $modelo)
    {
        //
        Cache::tags('calculos')->flush();
    }

    public function updated(Modelo $modelo)
    {
        //
        Cache::tags('calculos')->flush();
    }

    public function deleted(Modelo $modelo)
    {
        //
        Cache::tags('calculos')->flush();
    }
...

Y haremos que se ejecute editando app/Providers/AppServiceProvider.php

use App\Models\Modelo;
use App\Observers\CalculosObserver;

    public function boot()
    {
        //
        Modelo::observe(CalculosObserver::class);
    }

De esta manera tenemos un ejemplo de como cachear una SQL pesada/costosa y actualizada cada vez que añadamos un nuevo registro, lo modifiquemos o lo borremos.

Laravel y Tempus Dominus, un plugin javascript para escoger fecha y hora

Para escoger fechas en una página web no hace falta plugins, con código HTML es suficiente. Solo hay que poner un type=date:

    <div class="col-md-4">
        <label for="fecha" class="form-label">{{ __("Fecha") }}</label>
        <input type="date" id="fecha" name="fecha" class="form-control" aria-label="{{__("Fecha")}}" value="{{ old('fecha', $fecha) }}">
    </div>

Sin embargo, cuando es necesario tambien escoger una hora nos vemos obligados a usar un plugin como «Tempus Dominus» que nos deja escoger fecha y hora.

Para usarlo en Laravel vamos a enlazarlo en la cabecera de la página, junto con su traducción (locales), los estilos (css) y la libreria popper que es necesaria.

    <script src="{{ asset('popper.min.js')}}"></script>
    <script src="{{ asset('tempus-dominus-master/dist/js/tempus-dominus.min.js')}}"></script>
    <script src="{{ asset('tempus-dominus-master/dist/locales/es.js')}}"></script>
    <link href="{{ asset('tempus-dominus-master/dist/css/tempus-dominus.min.css') }}" rel="stylesheet"/>

Aquí voy a hacer una pequeña aclaración, para poder usar las traducciones he tenido que editar el archivo y dejar solo la constante «localization», por ejemplo en el caso del español, catalán, inglés y francés lo tenéis aquí ya modificado

Una vez enlazado en la cabecera lo presentaremos así en el HTML

    <div class="col-md-4">
        <label for="fecha" class="form-label">{{ __("Fecha") }}</label>
        <div class="input-group log-event" id="fechaDiv" data-td-target-input="nearest" data-td-target-toggle="nearest">
            <input id="fecha" type="text" class="form-control" data-td-target="#fechaDiv">
            <span class="input-group-text" data-td-target="#fechaDiv" data-td-toggle="datetimepicker">
                <i class="fas fa-calendar"></i>
            </span>
        </div>
    </div>

Y lo inicializaremos en javascript así

const datetimepicker1 = new tempusDominus.TempusDominus(document.getElementById('fechaDiv'),{
    localization: localization //nuestra constante en el archivo modificado de la cabecera
    ...
});

datetimepicker1.dates.setValue(tempusDominus.DateTime.convert(new Date()));

En el caso que debamos inicializar el plugin con una fecha que venga del PHP en lugar del javascript, cambiaremos la última línea con una variable de PHP que contenga un objeto Carbon, en los modelos es automático, por ejemplo, cambiaríamos la última línea por:

datetimepicker1.dates.setValue(tempusDominus.DateTime.convert( new Date('{{ $row->fecha->format("Y-m-d H:i:s") }}') ));

dónde «$row» es un registro de de la base de datos.

Recordar que hay que señalizarlo en el modelo:

protected $dates = ['fecha'];

Si no trabajamos con un modelo podemos obtener un objeto carbon directamente

use Carbon\Carbon;
...
class EjemploController extends Controller {

    public function index(Request $reques) {
        ...
        $fecha = Carbon::now();

Y hasta aquí llegamos

Actualizar la versión de PHP (de php 7.4 a php 8.2) en Ubuntu (Mint, etc)

Vamos a hablar de cambiar la versión de PHP, específicamente para actualizar la versión de php 7.4 a la 8.2, pero servirá casi totalmente para cambiar a cualquier versión. Ya sea para bajarla o subirla.

1. Lo primero es instalar la versión de PHP que quieres con las extensiones que necesites, en mi caso:

sudo apt install php8.2 php8.2-gd php8.2-intl php8.2-mcrypt php8.2-zip php8.2-mysql php8.2-mbstring php8.2-xml php8.2-curl 

2. Podríamos desinstalar la versión anterior de php, pero en mi caso la voy a dejar instalada por si necesito cambiar en algún otro momento. Por lo que no haré el paso siguiente:

sudo apt remove php7.4*

3. Lo que si vamos a hacer es deshabilitar el modulo de Apache anterior y habilitar el nuevo

sudo a2dismod php7.4 
sudo a2enmod php8.2 
sudo systemctl restart apache2

4. Y habilitar el php que queremos para la linea de comandos

sudo update-alternatives --config php